题目描述
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 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; // 剩余区间 = 总的区间数量 - 删除区间(被完全覆盖)
};