题目描述
1288. 删除被覆盖区间
难度 中等
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例:
输入: intervals = [[1,4],[3,6],[2,8]]
输出: 2
解释: 区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。
提示:
1 <= intervals.length <= 10000 <= intervals[i][0] < intervals[i][1] <= 10^5- 对于所有的
i != j:intervals[i] != intervals[j]
解析
- 先将区间按照起点升序排列,起点相同时降序排列;
- 如果是覆盖区间,则记录次数res;
- 如果是相交区间,则合并;
- 剩余区间 = 总数 - 覆盖区间;
function removeCoveredIntervals(intervals) {
let res = 0;
intervals.sort((a, b) => {
if (a[0] === b[0]) {
return b[1] - a[1];
}
return a[0] - b[0];
});
let [start, end] = intervals[0];
for (let i = 1; i < intervals.length; i++) {
let cur = intervals[i];
if (start <= cur[0] && cur[1] <= end) {
// 找到覆盖区间
res++;
} else if (cur[0] <= end && cur[1] >= end) {
// 相交区间,合并
end = cur[1];
} else if (end < cur[0]) {
[start, end] = cur;
}
}
return intervals.length - res;
}