435.无重叠区间【画图详解】

'''
Author: 365JHWZGo
Description: 435.无重叠区间
Date: 2021-11-04 09:24:02
FilePath: \Python\test\greedy\greedy-13.py
LastEditTime: 2021-11-04 10:02:47
LastEditors: 365JHWZGo
'''


class Solution(object):
    def eraseOverlapIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """
        if len(intervals) == 1:
            return 0
        intervals.sort(key=lambda x: x[0])

        end = intervals[0][1]
        ans = -1	#因为要和自己比较得加一,但是当只有一个数组时不用去除重复,所以为-1,加一后为0
        for i in intervals:
            if i[0] < end:
                ans += 1
            if end > i[1] or i[0]>=end:
                end = i[1]
        return ans


if __name__ == '__main__':
    p = Solution()
    # res = p.eraseOverlapIntervals([[-52, 31], [-73, -26], [82, 97], [-65, -11],[-62, -49], [95, 99], [58, 95], [-31, 49],[66, 98], [-63, 2], [30, 47], [-40, -26]])
    # res = p.eraseOverlapIntervals([[1,2],[2,3]])
    res = p.eraseOverlapIntervals([[1,2],[2,3],[3,4],[1,3]])
    print(res)

#本题的解题思路是:
贪心+排序

因为要使得去除重复的次数最少,即需要每一个intervals[i]所包裹的范围最小,这样的话出现重复的概率就会变低

局部最优:
做到每次更新后的end最小,这种情况不必考虑start,因为end与下一个i[0]比较时必然会出现以下三种情况,而不会出现start比i[0]还小,因为在进行贪心之前,我已经对数组进行了排序。

全局最优:
整个数组遍历后,所需要去除的重复次数最少

当i[0] < end时有两种情况:
第一种是------>end包裹住了整个i,这种情况就需要去除覆盖=>ans+=1 并且 重新更新end=> end = i[1]
在这里插入图片描述
第二种是------>end在i[1]之前,这种情况就只需要去除覆盖=>ans+=1 ,此时end所覆盖的范围比i小,不需要修改end值
在这里插入图片描述

第三种是------>end在i[0]之前,这种情况不需要去除覆盖,此时需要重新更新end,因为start变成了当前的 i[0] 需要更新end来使得其覆盖范围最小,以此来达到全局最优
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

365JHWZGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值