[路飞][LeetCode]1288_删除被覆盖区间

「这是我参与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 != jintervals[i] != intervals[j]

解题思路

  • 既然最后要求列表中剩余区间的数目,我们先定义一个count比令其为1
  • 如果区间列表的长度为1,那么我们不需要对这个区间列表做任何处理,直接返回count
  • 将区间列表进行排序(按子数组第一项升序排列,当第一项相同时,按第二项降序排列)方便删除被覆盖的区间
  • 遍历排序后的区间列表,如果当前项的第二个元素大于前一项的第二个元素,当前项说明无法被覆盖,将count1
  • 否则,当前项被覆盖进去

解题代码

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
};
复制代码

如有任何问题或建议,欢迎留言讨论!

猜你喜欢

转载自juejin.im/post/7068822199502635016