返回

LeetCode第435题:无重叠区间

前端





## LeetCode第435题:无重叠区间

**题目** 

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

**注意:** 

- 可以认为区间的终点总是大于它的起点。
- 区间[1,2]和[2,3]的边界相互“接触”,但没有相互重叠。

**示例:** 

输入: [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除区间[1,3]后,剩下的区间互不重叠。


## 解题思路

这一问题可以看成是一个求解最少删除区间数量的问题。要想使区间互不重叠,我们可以选择删除那些已经重叠的区间。

具体而言,我们可以采用贪心算法来解决这个问题。贪心算法是一种在每一步选择当前最优解的算法。在这个问题中,我们可以先将区间按照它们的终点从小到大排序,这样可以保证我们总是选择最左边的区间作为候选区间。

然后,我们从第一个区间开始遍历,如果当前区间与前一个区间重叠,则删除当前区间;否则,将当前区间添加到结果集中。

```python
def erase_overlap_intervals(intervals):
  """
  :type intervals: List[List[int]]
  :rtype: int
  """
  if not intervals:
    return 0

  # Sort the intervals by their end points
  intervals.sort(key=lambda x: x[1])

  # Initialize the result
  result = 0

  # Initialize the previous interval
  prev = intervals[0]

  # Iterate over the remaining intervals
  for interval in intervals[1:]:
    # If the current interval overlaps with the previous interval, remove the current interval
    if interval[0] < prev[1]:
      result += 1
    # Otherwise, update the previous interval
    else:
      prev = interval

  # Return the result
  return result

时间复杂度

该算法的时间复杂度为O(nlogn),其中n是区间数量。这是因为排序的时间复杂度为O(nlogn),而贪心算法本身的时间复杂度为O(n)。

空间复杂度

该算法的空间复杂度为O(n),这是因为我们需要创建一个新的数组来存储排序后的区间。