【路飞】1288. 删除被覆盖区间

96 阅读1分钟

题目描述

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]

解析

  1. 先将区间按照起点升序排列,起点相同时降序排列;
  2. 如果是覆盖区间,则记录次数res;
  3. 如果是相交区间,则合并;
  4. 剩余区间 = 总数 - 覆盖区间;
function removeCoveredIntervals(intervals) {
  let res = 0;
  intervals.sort((a, b) => {
    if (a[0] === b[0]) {
      return b[1] - a[1];
    }
    return a[0] - b[0];
  });
  let [start, end] = intervals[0];
  for (let i = 1; i < intervals.length; i++) {
    let cur = intervals[i];
    if (start <= cur[0] && cur[1] <= end) {
      // 找到覆盖区间
      res++;
    } else if (cur[0] <= end && cur[1] >= end) {
      // 相交区间,合并
      end = cur[1];
    } else if (end < cur[0]) {
      [start, end] = cur;
    }
  }
  return intervals.length - res;
}