'''
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来使得其覆盖范围最小,以此来达到全局最优