以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
分析
- 肯定是需要排序,主要是根据什么来排序,可以按照end来排序,那么就需要从后往前排序,不然,有可能最后有一个横穿这个数组的区间,就不能根据相邻间的边界来确定是否一个新的数组区间
- 同理,如果按照start排序,就需要从前往后遍历
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 先排序按照end
# 陷阱1, 当end相同时,需要按照start排序
intervals = sorted(intervals, key = lambda x: (x[1], x[0]))
start, end = intervals[-1]
# 保存结果
res = []
for i in range(len(intervals) - 1, -1, -1):
# 常态
tmp_start, tmp_end = intervals[i]
# 变化
if tmp_end >= start:
# 陷阱2,最小需要和之前的start进行比较,因为不一定前面的就是小的值
start = min(tmp_start, start)
else:
res.append([start, end])
start, end = tmp_start, tmp_end
# 收尾
res.append([start, end])
return res[::-1]