力扣算法中,无重叠区间和划分字母区间问题如何改写为长尾词?

2026-04-11 04:212阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计845个文字,预计阅读时间需要4分钟。

力扣算法中,无重叠区间和划分字母区间问题如何改写为长尾词?

菜鸟刷算法的一天,每天分享两道算法题,大家有这个想法的,可以关注我,一起坚持下去,每天踏上算法之旅。希望我们共同进步,一起加油!

+ LC + 435. 无重叠区间 + 给定一个区间的集合,请合并所有重叠的区间。

菜鸡刷算法的一天,每天分享两题算法,大家有这个想法的,可以给我个关注,然后一起坚持每天的算法之旅。希望我们共同进步,一起加油。 ​

LC 435. 无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ] 输出: 2 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: intervals = [ [1,2], [2,3] ] 输出: 0 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

解题思路:按照结束坐标进行升序排列,判断下一个值的开始坐标是否小于这个值的结束坐标,若是就删除数量 + 1。

代码:

var eraseOverlapIntervals = function(intervals) { intervals.sort((a,b) => { return a[1] - b[1] }) let res = 0; let pos = intervals[0][1]; for(let i = 1; i < intervals.length; i++) { if(intervals[i][0] < pos) { res++; } else { pos = intervals[i][1]; } } return res; }; LC 763. 划分字母区间

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

示例:

输入:S = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

解题思路:创建一个存放各个单词的最晚出现的位置。然后再进行遍历,直到遍历到 遇见的单词中最晚出现的位置时,表示这就是一个片段。然后开始遍历下一个片段。

代码:

力扣算法中,无重叠区间和划分字母区间问题如何改写为长尾词?

var partitionLabels = function(s) { let hash = {} for(let i = 0; i < s.length; i++) { //遍历字符串,将每个单词出现最晚的位置放进 hash 表中 hash[s[i]] = i; } let res = []; let l = 0, r = 0; for(let i = 0; i < s.length; i++) { //遍历字符串,将遍历到的单词中的最晚出现位置 赋给 r,当 r 等于遍历到的位置,就相当于这就是一个最小的一个片段,开始遍历下一个片段。 r = Math.max(r, hash[s[i]]); if(r === i) { res.push(r - l + 1); l = i + 1; } } return res; };

本文共计845个文字,预计阅读时间需要4分钟。

力扣算法中,无重叠区间和划分字母区间问题如何改写为长尾词?

菜鸟刷算法的一天,每天分享两道算法题,大家有这个想法的,可以关注我,一起坚持下去,每天踏上算法之旅。希望我们共同进步,一起加油!

+ LC + 435. 无重叠区间 + 给定一个区间的集合,请合并所有重叠的区间。

菜鸡刷算法的一天,每天分享两题算法,大家有这个想法的,可以给我个关注,然后一起坚持每天的算法之旅。希望我们共同进步,一起加油。 ​

LC 435. 无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: intervals = [ [1,2], [1,2], [1,2] ] 输出: 2 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: intervals = [ [1,2], [2,3] ] 输出: 0 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

解题思路:按照结束坐标进行升序排列,判断下一个值的开始坐标是否小于这个值的结束坐标,若是就删除数量 + 1。

代码:

var eraseOverlapIntervals = function(intervals) { intervals.sort((a,b) => { return a[1] - b[1] }) let res = 0; let pos = intervals[0][1]; for(let i = 1; i < intervals.length; i++) { if(intervals[i][0] < pos) { res++; } else { pos = intervals[i][1]; } } return res; }; LC 763. 划分字母区间

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

示例:

输入:S = "ababcbacadefegdehijhklij" 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

解题思路:创建一个存放各个单词的最晚出现的位置。然后再进行遍历,直到遍历到 遇见的单词中最晚出现的位置时,表示这就是一个片段。然后开始遍历下一个片段。

代码:

力扣算法中,无重叠区间和划分字母区间问题如何改写为长尾词?

var partitionLabels = function(s) { let hash = {} for(let i = 0; i < s.length; i++) { //遍历字符串,将每个单词出现最晚的位置放进 hash 表中 hash[s[i]] = i; } let res = []; let l = 0, r = 0; for(let i = 0; i < s.length; i++) { //遍历字符串,将遍历到的单词中的最晚出现位置 赋给 r,当 r 等于遍历到的位置,就相当于这就是一个最小的一个片段,开始遍历下一个片段。 r = Math.max(r, hash[s[i]]); if(r === i) { res.push(r - l + 1); l = i + 1; } } return res; };