[路飞]_1288. 删除被覆盖区间

111 阅读1分钟

题目路径

题目描述

给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。

只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。

在完成所有删除操作后,请你返回列表中剩余区间的数目。

示例:

输入: intervals = [[1,4],[3,6],[2,8]]
输出: 2
解释: 区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。

提示:

  • 1 <= intervals.length <= 1000
  • 0 <= intervals[i][0] < intervals[i][1] <= 10^5
  • 对于所有的 i != j:intervals[i] != intervals[j]

解题思路

  • 由题可知,是需要让我们求出被删除区间剩余的数目。
  • 所以在输入数组中,找到某个值的范围,c <= a 且 b <= d时,我们才认为区间被覆盖了
  • 首先我们要对输入值按照所有值的第一位去排序
  • 然后设置一个cnt作为被删除的数,当满足c <= a 且 b <= d时,cnt就加1

代码

var removeCoveredIntervals = function(intervals) {
    intervals.sort((a, b) => {
        if (a[0] == b[0]) {
            return b[1] - a[1];
        }
        return a[0] - b[0];
    })
    console.log('intervals', intervals);
    let i = 0, len = intervals.length, cnt = 0; // cnt:记录当前被完全覆盖的区间数量
    while (i < len) {
        let [m, n] = intervals[i], j = i + 1;
        while (j < len && m <= intervals[j][0] && n >= intervals[j][1]) {
            cnt++;
            j++;
        }
        i = j;
    }
    return len - cnt; // 剩余区间 = 总的区间数量 - 删除区间(被完全覆盖)
};