【路飞】算法与数据结构-删除被覆盖区间

130 阅读1分钟

不管全世界所有人怎么说,我都认为自己的感受才是正确的。无论别人怎么看,我绝不打乱自己的节奏。喜欢的事自然可以坚持,不喜欢的怎么也长久不了。

LeetCode:原题地址

题目要求

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

只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。

在完成所有删除操作后,请你返回列表中剩余区间的数目。

示例 1:

输入: 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]

思路

先对intervals进行排序,排序的依据是:

  • 若区间开头不相同,则开头元素小的在前
  • 若开头元素相同,末尾元素大的在前
/**
 * @param {number[][]} intervals
 * @return {number}
 */
var removeCoveredIntervals = function(intervals) {
    intervals.sort((a, b) => a[0] === b[0] ? b[1] - a[1] : a[0] - b[0])
    let right = intervals[0][1]
    let left = intervals[0][0]
    let count = 0
    const n = intervals.length
    for(let i = 1; i < n; i++) {
        const interv = intervals[i]
        if(interv[1] <= right && interv[0] >= left) {
            count++
        }
        // 这里注意,被多个区间覆盖住的区间,也算是被覆盖区间
        if(interv[1] >= right && right >= interv[0]) {
            right = interv[1]
        }

        if(interv[1] > right) {
            left = interv[0]
            right = interv[1]
        }
    }
   return n - count
};