这几天PPT快做🤮了,不过终于放假咯😋
一、题目
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/non-overlapping-intervals
二、解法
1.最初的解法
没有注意到的是需要找到满足条件的弹出最小区间的数量,因此排序之后的数组,要满足不重叠条件要求并且区间间距要尽量小,这样才容的下更多的区间。
最初没有注意最小区间数量,所以解答错误,在原解上,增加筛选条件即可:
def solution(intervals):
if not len(intervals):
return 0
out = 0
intervals.sort() #以开始节点排序
reserve = intervals[0]
for i in range(1,len(intervals)):
if intervals[i][0] >= reserve[1] :
reserve = intervals[i] #满足不重叠条件 可以保留
elif intervals[i][1] <= reserve[1] : # 区间间距更小的保留,不符合的弹出
out += 1
reserve = intervals[i]
else:
out += 1 # 不满足条件,直接弹出
return out
# Run time: 84ms Memory consump:17.9MB
2.以开始节点排序,从右往左找
参考题解中采用的贪心算法,对排序之后的区间进行遍历,将符合条件的区间间距最小的留下:
def solution(intervals):
if not len(intervals):
return 0
save = 1
n = len(intervals)
intervals.sort()
reserve = intervals[n-1][0]
for i in range(n-2,-1,-1):
if intervals[i][1] <= reserve :
save += 1
reserve = intervals[i][0]
return n - save
# Run time: 88ms Memory consump:17.8MB
3.以结束节点排序,从左往右找
def solution(intervals):
if not len(intervals):
return 0
save = 1
n = len(intervals)
intervals.sort(key = lambda x : x[1])
reserve = intervals[0][1]
for i in range(1,len(intervals)):
if intervals[i][0] >= reserve :
save += 1
reserve = intervals[i][1]
return n - save
# Run time: 80ms Memory consump:17.8MB
本文介绍了解决区间集合去重问题的三种算法实现方法,并通过具体示例对比了不同方法的时间和空间复杂度。
186

被折叠的 条评论
为什么被折叠?



