LeetCode 435. 无重叠区间

这道题目是在给定的集合中找到需要去掉的区间最小数量,使得剩余区间互相不重叠,题目如下:
题目
这道题目似乎无从下手,因为找重叠的区域确实是比较麻烦的。我们可以尝试用贪心算法来解答这个问题,我们假设有集合: i n t e r v a l s = [ [ 1 , 2 ] , [ 3 , 5 ] , [ 2 , 3 ] , [ 3 , 6 ] , [ 7 , 8 ] , [ 6 , 7 ] ] intervals=[[1,2],[3,5],[2,3],[3,6],[7,8],[6,7]] intervals=[[1,2],[3,5],[2,3],[3,6],[7,8],[6,7]]
我们来用这个集合为例用贪心的思想来解决这道题目:
1
首先,我们将这个集合里面每个元素的尾部,也就是区间的尾部进行排序操作:
2
然后我们标记最小的区间的结束值,记为 minEnd;然后标记此时集合中不重合区间的个数,记为 result,那么有:
3
然后我们遍历集合中的区间元素,我们将区间的起始值和当前的最小区间结束值 minEnd 进行比较,如果起始值比 minEnd 要小,那么就可以说明这两个区间重合了。我们这里比较第二个区间 [2,3] 中的起始值2和当前的最小结束值 minEnd = 2, 此时区间的起始值没有比 minEnd 小,那么我们更新 result 和 minEnd 分别为2和3:
4
同理,我们再更新一步:
5
这个时候来了一个区间 [ 3 , 6 ] [3,6] [3,6],起始值是3,比此时的 minEnd 小,那么我们不管这个区间,把它去掉:
6
再来,同样的道理,我们可以继续更新:
7
8
这个时候我们不重叠的区间就有result=5个,所以我们需要去掉的区间是 [ 3 , 6 ] [3,6] [3,6],最终我们将整个集合的长度减去不重叠区间的长度就是要去掉的空间数了。逻辑清晰之后我们就可以上代码了:

class Solution(object):
    def eraseOverlapIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """
        if not len(intervals):
            return 0
        # 以尾部将区间进行排序
        intervals.sort(key=lambda k:k[1])
        # 初始化result 和 minEnd
        minEnd = intervals[0][1]
        result = 1
        for i in range(1, len(intervals)):
        	# 比较区间头部和 minEnd,小的话就直接去掉,大于的话就不重叠,更新result 和 minEnd
            if intervals[i][0] < minEnd:
                continue
            result += 1
            minEnd = intervals[i][1]
        return len(intervals) - result

这其实也是一个贪心的思想,希望通过这个题目能够帮助大家对贪心思想有更全面的认识,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值