力扣算法JS LC [435. 无重叠区间] LC [763. 划分字母区间]

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;
};

猜你喜欢

转载自blog.csdn.net/weixin_51642358/article/details/125837651