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:
- You may assume the interval’s end point is always bigger than its start point.
- 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较大的。