「这是我参与2022首次更文挑战的第40天,活动详情查看:2022首次更文挑战」
看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 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]
解题思路
- 既然最后要求列表中剩余区间的数目,我们先定义一个
count
比令其为1
- 如果区间列表的长度为
1
,那么我们不需要对这个区间列表做任何处理,直接返回count
- 将区间列表进行排序(按子数组第一项升序排列,当第一项相同时,按第二项降序排列)方便删除被覆盖的区间
- 遍历排序后的区间列表,如果当前项的第二个元素大于前一项的第二个元素,当前项说明无法被覆盖,将
count
加1
- 否则,当前项被覆盖进去
解题代码
var removeCoveredIntervals = function(intervals) {
let count = 1 // intervals的length最小为1,所以count可以初始化为1
if(intervals.length==1) return count // 处理长度为1的边界
intervals.sort((a,b)=> a[0] === b[0] ? b[1] - a[1] : a[0] - b[0]) // 对区间数组进行排序,方便删除被覆盖的区间
for(let i =1;i<intervals.length;i++){
if(intervals[i][1]>intervals[i-1][1]){ // 当前项的第二个元素大于前一项的第二个元素,当前项说明无法被覆盖
count++
}else{
intervals[i]=intervals[i-1] // 进行覆盖操作
}
}
return count
};
复制代码
如有任何问题或建议,欢迎留言讨论!