返回

快速删除无用区间,优化区间合并效率

前端

路飞 | 《LeetCode》1288_删除被覆盖区间

1. 题目介绍

题目给你一个包含闭区间形式的区间的集合intervals和另一个闭区间newInterval,你需要删除所有被newInterval完全覆盖的区间,并返回更新后的intervals。

2. 思路分析

我们可以使用贪心算法来解决这个问题。遍历intervals中的每一个区间,如果当前区间与newInterval没有交集,则直接添加到结果中。如果当前区间与newInterval有交集,则将当前区间与newInterval合并,合并后的区间添加到结果中。

3. 具体实现

def remove_covered_intervals(intervals, new_interval):
  """
  :type intervals: List[List[int]]
  :type new_interval: List[int]
  :rtype: List[List[int]]
  """
  result = []
  # 遍历intervals中的每个区间
  for interval in intervals:
    # 如果当前区间与newInterval没有交集,则直接添加到结果中
    if not has_intersection(interval, new_interval):
      result.append(interval)
    # 如果当前区间与newInterval有交集,则将当前区间与newInterval合并
    else:
      result.append(merge_intervals(interval, new_interval))

  return result

def has_intersection(interval1, interval2):
  """
  判断两个区间是否有交集

  :param interval1: 区间1
  :param interval2: 区间2
  :return: True if there is an intersection, False otherwise
  """
  return not (interval1[1] < interval2[0] or interval2[1] < interval1[0])

def merge_intervals(interval1, interval2):
  """
  合并两个区间

  :param interval1: 区间1
  :param interval2: 区间2
  :return: 合并后的区间
  """
  return [min(interval1[0], interval2[0]), max(interval1[1], interval2[1])]

4. 算法复杂度

该算法的时间复杂度为O(n log n),其中n为intervals中的区间的个数。

5. 总结

这道题考察了区间合并的技巧,我们可以使用贪心算法来解决这个问题,从而达到快速删除被覆盖区间的目的。