435. Non-overlapping Intervals

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较大的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值