题目
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例
输入: intervals = [[1,4],[3,6],[2,8]]
输出: 2
解释: 区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。
题解
贪心
分析思路,对于数组 intervals = [[1,4],[3,6],[2,8],[2,10]]; intervals[i] = [x,y]
- 排序,根据 intervals[i]的x从小到大排序,如果x相同,根据y值从大到小排序
- 排序后intervals = [ [ 1, 4 ], [ 2, 10 ], [ 2, 8 ], [ 3, 6 ] ]
- 起始值start = y;从下标为1的值开始枚举数组,
- 如果 intervals[k] 位置 y 小于 start; 该数组将会被覆盖;
理解一下这句话,因为数组intervals已经排序;所以intervals[k]的x肯定是要大于intervals[k-1]的x;此时intervals[k] 位置 y 小于 start; intervals[k]确定被删除;数组长度-1 - 如果intervals[k] 位置 y 不大于 start;更新start值
- 枚举完成,得到删除的结果
代码
var removeCoveredIntervals = function(intervals) {
let len = intervals.length;
intervals.sort((a, b) => {
if (a[0] === b[0]) {
return b[1] - a[1];
} else {
return a[0] - b[0];
}
});
let max = intervals[0][1];
let result = len;
for (let i = 1; i < len; i++) {
if (intervals[i][1] <= max) {
result--;
} else {
max = Math.max(max, intervals[i][1]);
}
}
return result;
};