记录 1 道算法题
删除被覆盖区间
1288. 删除被覆盖区间 - 力扣(LeetCode) (leetcode-cn.com)
要求:提供一个二维数组,里面的每一项是一个升序的集合,需要将集合的左右边界都在另一个集合内的集合删掉。返回剩余的集合数量
例如:[[1,4],[3,6],[2,8]],输出: 2
解题方法很简单,假设二维数组是按照集合的左边界升序排列,我们可以得到左边界是一定被包裹的,剩下就是右边界如何判断的问题。
假设在左边界是升序的同时,右边界也尽可能的降序排序,那么排序后的数组一定有一部分右边界是降序的,而右边界降序的那些拥有最大右边界的集合,就是我们剩下的集合的人选。
因为当左边界稳定升序的时候,如果前一个的集合的右边界比后一个集合大,那么意味着后一个集合会被前一个集合覆盖,然后删去。
完整代码如下:
function removeCoveredIntervals(intervals) {
// 优先按照左边界升序排列,当左边界相等时,按照右边界降序排列
// 右边要降序排列,因为会保存一个当前合并区间
intervals.sort((a, b) => a[0] === b[0] ? b[1] - a[1] : a[0] - b[0])
let last = intervals[0]
// 因为是从第二个开始遍历,所以第一个先算入剩余集合
let count = 1
for(let i = 1; i < intervals.length; i++) {
const inte = intervals[i]
// 知道左边界是升序的,所以只需要比较右边界
if (inte[1] > last[1]) {
// 当当前集合的右边界更大的时候,并且这个是剩余集合
count++
// 将合并集合设为当前集合
last = inte
}
}
return count
}