(js)leetcode 1288. 删除被覆盖区间

题目:

给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。

只有当 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]

思路:

1.  按起点升序排序,起点相同时降序排序

2. 排序之后,两个相邻区间可能有如下三种相对位置:

情况1:找到覆盖区间

情况2:找到相交区间,合并

情况3:完全不相交,更新起点和终点

代码实现:

/**
 * @param {number[][]} intervals
 * @return {number}
 */
var removeCoveredIntervals = function(intervals) {
    // 按起点升序排序,起点相同时降序排序
    intervals.sort((a,b)=>{
        if(a[0]=== b[0]) {
            return b[1]-a[1];
        }
        return a[0]-b[0];
    })

    // 记录合并区间的起点和终点
    let left = intervals[0][0];
    let right = intervals[0][1];

    let res = 0;
    for(let i = 0; i < intervals.length; i++) {
        let intv = intervals[i];
        // 情况1:找到覆盖区间
        if(left <= intv[0] && right >= intv[1]) {
            res++;
        }
        // 情况2:找到相交区间,合并
        if(right >= intv[0] && right <= intv[1]) {
            right = intv[1];
        }
        // 情况3:完全不相交,更新起点和终点
        if(right < intv[0]) {
            left = intv[0];
            right = intv[1];
        }
    }

    return intervals.length - res + 1;
};

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值