一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情。
一.题目:
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]
二、思路分析:
这道题目其实有两种思路可以进行求解,第一种就是直接计算它的不覆盖的区间,第二种就是计算它的覆盖区间,然后利用整个数组的长度减去被覆盖区间的长度即可,两种思路的步骤如下:
- 这种区间问题,我们一般都需要对其进行
排序,一般都是按照起点升序排序,如果遇到起点相同的情况,我们将按照终点降序排列即可。 - 对于第一种情况,我们初始化一个
end为第一项的终点值,然后在循环中找寻大于此end值的区间,如果遇到直接将结果加1即可,因为我们已经排好序的情况下当前循环的区间就一定不是此前end代表的区间的覆盖区间,然后将end值赋值为当前循环的区间的终点值即可。 - 第二种情况计算覆盖区间数量就需要在加上一个
start值进行判断,有三种情况:区间完全覆盖,区间部分重叠以及完全不重叠,每种情况分别讨论最终也能求出结果。
三、代码:
/**
* @param {number[][]} intervals
* @return {number}
*/
var removeCoveredIntervals = function(intervals) {
let n = intervals.length
//先对intervals进行排序
intervals.sort((a,b)=>{
if(a[0] == b[0]){
return b[1] - a[1]
}
return a[0] - b[0]
})
let res = 1
let end = intervals[0][1]
for(let i=1 ; i<intervals.length ; i++){
if(intervals[i][1] > end){
res++
end = intervals[i][1]
}
}
return res
};
四、总结:
这道题目首先需要看到区间问题我们就要进行排序,想到排序后仅需要统计覆盖区间或者不是覆盖区间的数量即可。其实这种题目也要求着我们多画图,因为有可能有隐含条件是我们没发现的,画图能够让思路更清楚。