题目描述
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 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]
解题思路
本题要求我们将被覆盖的区间删除,这里我们可以首先对输入数组排序,排序的规则是按照区间的开始值进行升序排序,如果区间开始值相同,则让区间结束值大的在前面。
这样排序后的数组,就保证了,前面区间的开始值都必然小于等于后面区间的开始值,而区间开始值相同的区间,区间结束值大的必然在前面。
接下来我们从前向后扫描排序后的数组,如果当前区间的结束值小于等于前面区间的结束值,则该区间一定被前面的区间覆盖。
又因为本题只需要返回剩余区间的数目,所以我们不需要进行实际的区间删除,只需要初始化结果值为输入数组的长度,当找到一个被覆盖区间后,将结果值 -1,这样遍历完排序后的数组,就得到了剩余的区间数目。
动画演示
代码实现
var removeCoveredIntervals = function(intervals) {
// [a,b] 按照a升序从小到大排列,b按照降序从大到小排列
intervals.sort((a,b)=> {
if(a[0] == b[0]){
return b[1] - a[1]
}
return a[0] - b[0];
})
let i =0, len = intervals.length,cnt = 0;
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;
};
此时我们就完成了leetcode-1288-删除被覆盖区间