不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。
LeetCode:原题地址
题目要求
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例 1:
输入: 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]
思路
先对intervals进行排序,排序的依据是:
- 若区间开头不相同,则开头元素小的在前
- 若开头元素相同,末尾元素大的在前
/**
* @param {number[][]} intervals
* @return {number}
*/
var removeCoveredIntervals = function(intervals) {
intervals.sort((a, b) => a[0] === b[0] ? b[1] - a[1] : a[0] - b[0])
let right = intervals[0][1]
let left = intervals[0][0]
let count = 0
const n = intervals.length
for(let i = 1; i < n; i++) {
const interv = intervals[i]
if(interv[1] <= right && interv[0] >= left) {
count++
}
// 这里注意,被多个区间覆盖住的区间,也算是被覆盖区间
if(interv[1] >= right && right >= interv[0]) {
right = interv[1]
}
if(interv[1] > right) {
left = interv[0]
right = interv[1]
}
}
return n - count
};