435. Non-overlapping Intervals

来源:互联网 发布:lol淘宝代练封号 编辑:程序博客网 时间:2024/06/14 09:08

Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.

Note:

  1. You may assume the interval’s end point is always bigger than its start point.
  2. Intervals like [1,2] and [2,3] have borders “touching” but they don’t overlap each other.

Example 1:

**Input:** [ [1,2], [2,3], [3,4], [1,3] ]**Output:** 1**Explanation:** [1,3] can be removed and the rest of intervals are non-overlapping.

Example 2:

**Input:** [ [1,2], [1,2], [1,2] ]**Output:** 2**Explanation:** You need to remove two [1,2] to make the rest of intervals non-overlapping.

Example 3:

**Input:** [ [1,2], [2,3] ]**Output:** 0**Explanation:** You don't need to remove any of the intervals since they're already non-overlapping.

一个典型的贪心问题,极其的类似算法导论所提到的活动选择问题:
活动选择问题的贪心策略可以是
- 优先考虑活动结束早的!!

所以这个题目的贪心策略也可以是这样:
1. 先排序,按照Intervals的end的升序进行排序
1. 贪心策略是选择end小的!
1. 可以选择是begin在上个end之后的

所以,具体代码如下:
- 排序为了方便我把end放在前面了
- k指的是上一次我所选择的Interval的序号

class Solution(object):    def eraseOverlapIntervals(self, intervals):        """        :type intervals: List[Interval]        :rtype: int        """        l = sorted((i.end,i.start) for i in intervals)#[ [1,2], [2,3], [3,4], [1,3] ] 排序后 [[2,1],[3,1],[3,2],[4,3]]        n=len(l)        ans=0        k=0        for i in range(1,n):            if l[i][1]>=l[k][0]:                k=i            else:                ans+=1        return ans

当然 贪心策略也可以是begin较大的。

0 0