题目
解题思路
要求找到移除的最小数量,如果区间之间发生重叠我们需要移除的就应该为范围更大的一个区间,因为这样的区间与后序(顺序排序下)区间更可能再次发生重叠。
如何界定范围更大的区间?
- 完全包含另一个区间的
- 与另一个区间重叠了一部分,同时整体靠后的区间
如下图,其中与A发生重叠时候,B、C是我们需要移除的区间,因为更可能和后面的区间再次发生重叠。
同时因为需要进行区间的比较,所以要采用全局变量记录当前的最小区间,只有不发生重叠的时候或遇到了更小区间的时候,才更新当前的最小区间。
代码实现
# 如果重叠只保留小的区间
class Solution:
def eraseOverlapIntervals(self, intervals) -> int:
if not intervals:
return 0
# 先排序,获取区间之间的顺序
intervals = sorted(intervals)
lastx, lasty = intervals[0]
s, res = 1, 0
while s < len(intervals):
# 被包含:1. 完全被包含 2. 包含了一部分
if lastx <= intervals[s][0] < lasty and intervals[s][-1] >= lasty:
# print(lastx, lasty, intervals[s][0], intervals[s][-1])
res += 1
s += 1
continue
# 包含了别人
elif lastx <= intervals[s][0] < lasty and intervals[s][-1] <= lasty:
res += 1
# 完全不重叠
lastx, lasty = intervals[s]
s += 1
return res