给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
本题主要有两个难点:
- 如何找到贪心策略
- 如何断定两区间重叠
贪心策略:
- 问题转化:移除哪个区间,转化为选择哪些区间
- 贪心选择:
根据每个区间的末尾排序,由小到大,这样下一个元素更不可能与其重叠,我们选择的便就更多。
当新区间和上一个选择的重叠时,因为他的结尾更大,我们只需记录移除加一,不选择他
当新区间未和上一个选择重叠时,我们选择他。并于下一个新区间检查重叠
如何断定两区间重叠:
因为我们采用右边界,由小到大排序,所以新区间右边界>=原区间右边界
此时当且仅当新左边界<原区间右边界,两区域重叠
代码:
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
#空列表,返回0
if len(intervals)==0:
return 0
#根据每个**区间的末尾排序**,由小到大
intervals.sort(key=lambda x:x[1])
l=intervals[0]
m=0
for i in range(1,len(intervals)):
#两区域重叠,记录加一
if intervals[i][0]<l[1]:
m+=1
#不重叠,选择它
else:
l=intervals[i]
return m
附加:一般(未排序)区间重叠性
通过对这五种情况的分析得出:
当两区间重叠时,满足: B左边界<=A左边界<B右边界 or A左边界<=B左边界<A右边界
当两区间不重叠时,不会满足上述结论。