题目
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回需要移除区间的最小数量,使剩余区间互不重叠。
例:
输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。
方法:贪心算法
按照右边界的大小进行从小到大的排序,为了尽可能的得到少的移除区间,应该选择右边界小的元素,右边界越小那么留给下一个区间的空间就越大
- 若集合中不存在任何区间,那么没有需要移除的区间,返回零
- 按照有边界进行从小到大的排序
- count 表示非交叉区间的个数,若想要求得移除区间的最小值,只需要用集合的数量减去非交叉区间的个数即可。end 表示区间的分界点
- 从左到右循环遍历集合,起始值为 1,因为第一个非交叉区间一定是集合的第一个区间。若此区间的起始值大于 end,表示两个区间并不相交,此区间不需要被移除,则 count + 1,同时更新 end 为此区间的右边界
class Solution(object):
def eraseOverlapIntervals(self, intervals):
if len(intervals) == 0:
return 0
intervals.sort(key = lambda x:(x[1]))
count = 1
end = intervals[0][1]
for i in range(1, len(intervals)):
if end <= intervals[i][0]:
count += 1
end = intervals[i][1]
return len(intervals) - count
参考
代码相关:https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html