删除被覆盖区间

简介: 🎈今天给大家带来的是算法练习,题目为"删除被覆盖区间"。

说在前面

🎈今天给大家带来的是算法练习,题目为"删除被覆盖区间"。

题目描述

给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。\
只有当 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]

思路分析

题目描述很清晰,就是要我们把给出列表中的小区间删除,最后返回剩余元素的个数。这里的小区间是指列表中有包含该区间的大区间时,该区间即为小区间,即题目所说的只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖,如图:
1649867590(1).png
相对于区间[1,4]来说,[2,4]是小区间,但相对于[1,5]来说,[1,4]又是小区间,所以[[1,4],[2,4],[1,5]]删除掉小区间后应该只剩下[[1,5]],具体解题思路如下:

  • 列表排序

我们要让做端点小的排在前面,如果左端点相等则让右端点大的排在前面,只要我们只需要一次遍历比较右端点即可得到答案。

intervals = intervals.sort((a,b)=>{
    if(a[0] == b[0]) return b[1] - a[1];
    return a[0] - b[0];
})
  • 遍历列表比较右端点
let r = intervals[0][1];
for(let i = 1; i < intervals.length; i++){
    if(r >= intervals[i][1]) res--;
    else r = intervals[i][1];
}

AC代码

/**
 * @param {number[][]} intervals
 * @return {number}
 */
var removeCoveredIntervals = function(intervals) {
    let res = intervals.length;
    intervals = intervals.sort((a,b)=>{
        if(a[0] == b[0]) return b[1] - a[1];
        return a[0] - b[0];
    })
    let r = intervals[0][1];
    for(let i = 1; i < intervals.length; i++){
        if(r >= intervals[i][1]) res--;
        else r = intervals[i][1];
    }
    return res;
};

说在后面

🎉这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,平时也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。
目录
相关文章
数组筛选,将数组[2,0,6,1,77,0,52,0,25,7]中大于等于10元素选出来,放入新数组,声明一个新的数组用于存放新数据newArr,遍历原来的旧数组,找到大于10的元素,依次追加新数组
数组筛选,将数组[2,0,6,1,77,0,52,0,25,7]中大于等于10元素选出来,放入新数组,声明一个新的数组用于存放新数据newArr,遍历原来的旧数组,找到大于10的元素,依次追加新数组
|
6月前
leetcode2397. 被列覆盖的最多行数
leetcode2397. 被列覆盖的最多行数
35 1
leetcode2397. 被列覆盖的最多行数
|
6月前
|
算法
递归淘汰List集合头部数据,获取最终集合的起始坐标
递归淘汰List集合头部数据,获取最终集合的起始坐标
|
6月前
|
索引
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
|
6月前
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
删除数组中重复出现的值
删除数组中重复出现的值
72 0
|
存储 编译器 C++
【c++】:list模拟实现“任意位置插入删除我最强ƪ(˘⌣˘)ʃ“
【c++】:list模拟实现“任意位置插入删除我最强ƪ(˘⌣˘)ʃ“
105 0
在给定范围的数据中找到含有6的数据个数
在给定范围的数据中找到含有6的数据个数
|
算法 Go
算法练习第十题——寻找重复数(不修改数组)
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。