「LeetCode」1288-删除被覆盖区间

292 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

一.题目:

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 != jintervals[i] != intervals[j]

二、思路分析:

这道题目其实有两种思路可以进行求解,第一种就是直接计算它的不覆盖的区间,第二种就是计算它的覆盖区间,然后利用整个数组的长度减去被覆盖区间的长度即可,两种思路的步骤如下:

  • 这种区间问题,我们一般都需要对其进行排序,一般都是按照起点升序排序,如果遇到起点相同的情况,我们将按照终点降序排列即可。
  • 对于第一种情况,我们初始化一个end为第一项的终点值,然后在循环中找寻大于此end值的区间,如果遇到直接将结果加1即可,因为我们已经排好序的情况下当前循环的区间就一定不是此前end代表的区间的覆盖区间,然后将end值赋值为当前循环的区间的终点值即可。
  • 第二种情况计算覆盖区间数量就需要在加上一个start值进行判断,有三种情况:区间完全覆盖,区间部分重叠以及完全不重叠,每种情况分别讨论最终也能求出结果。

三、代码:

/**
 * @param {number[][]} intervals
 * @return {number}
 */
var removeCoveredIntervals = function(intervals) {
    let n = intervals.length
    //先对intervals进行排序
    intervals.sort((a,b)=>{
        if(a[0] == b[0]){
            return b[1] - a[1]
        }
        return a[0] - b[0]
    })
    let res = 1
    let end = intervals[0][1]
    for(let i=1 ; i<intervals.length ; i++){
        if(intervals[i][1] > end){
            res++
            end = intervals[i][1]
        }
    }
    return res
};

四、总结:

这道题目首先需要看到区间问题我们就要进行排序,想到排序后仅需要统计覆盖区间或者不是覆盖区间的数量即可。其实这种题目也要求着我们多画图,因为有可能有隐含条件是我们没发现的,画图能够让思路更清楚。