# [1288] 删除被覆盖区间
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 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]
这道题也是一道判断区间交并之间关系的题目。
解决该类型的问题需要先进行排序。但这道题稍微特殊一点,他的排序规则为:起点升序排列,终点降序排列。当两区间起始相同时,比较区间以范围较大的优先。这是为了解决类似如 [[1, 2],[1, 4]] 这样的列表中[1,2]不被识别为被覆盖区间的问题的。
接下来就比较简单了,只需要判断区间的右侧位置即可确定两个区间之间是否存在交集了。
若区间右侧位置比前一个区间右侧小的话,说明该区间已经被完全覆盖了,删除计数器+1。否则说明不能被覆盖,则更新比较区间为新区间。
var removeCoveredIntervals = function(intervals) {
// 先排序,接下来就只用判断区间右侧位置与新区间之间的关系
// 注意,当两区间起始相同时,比较区间以范围较大的优先,即:起点升序排列,终点降序排列
intervals.sort((a, b) => {
if (a[0] === b[0]) return b[1] - a[1];
return a[0] - b[0];
});
let res = 0;
// 先初始化区间的结束位置
// 因为之前的排序新区间起始位置不可能小于 left,因此左侧位置不需要比较
let right = intervals[0][1];
for (let i = 1; i < intervals.length; i++) {
const newRight = intervals[i][1];
if (right >= newRight) {
// 新的区间完全被覆盖了,满足要求
res += 1;
} else {
// 新区间不能被完全覆盖,则更新匹配区间位置
right = newRight;
}
}
return intervals.length - res;
};