56. 合并区间
Posted panweiwei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了56. 合并区间相关的知识,希望对你有一定的参考价值。
方法一:思路见注释。
1 class Solution(object): 2 def merge(self, intervals): 3 """ 4 :type intervals: List[List[int]] 5 :rtype: List[List[int]] 6 """ 7 if len(intervals) <= 1: 8 return intervals 9 res = [] 10 # 将区间升序排列,先按区间左端点,左端点相同的按右端点排序 11 intervals = sorted(intervals, key=lambda interval: (interval[0], intervals[1])) 12 # 遍历intervals,interval为当前区间 13 for interval in intervals: 14 # 若res为空或者res中最后一个区间的右端点小于interval区间的左端点,说明没有交集,可将interval追加到res中 15 if not res or res[-1][1] < interval[0]: 16 res.append(interval) 17 # 若res为空或者res中最后一个区间的右端点不小于interval区间的左端点,说明有交集 18 # res中最后一个区间的右端点替换为max(res中最后一个区间的右端点, interval的右端点) 19 elif res[-1][1] >= interval[0]: 20 res[-1][1] = max(res[-1][1], interval[1]) 21 return res 22 23 24 if __name__ == ‘__main__‘: 25 solution = Solution() 26 print(solution.merge([[2, 2], [2, 5], [4, 5], [6, 7], [8, 9], [1, 10]]))
方法二:可以考虑用栈。
区间左端点视为入栈,右端点视为出栈,每当栈空时,记录下最后一对左右端点。
1、intervals中各区间左端点取出,放入left{},转set时会自动去重、升序排列;
2、各区间右端点取出,放入right{};
3、构造pos = list[[] for i in range(len(left) + len(right))];
4、用指针i遍历left,pos[i].append(1);
5、用指针j遍历right,pos[j].append(-1);
6、遍历pos,用start记录pos[index]!=[]的起始位置,令sum+=pos[index],
若sum=0时追加[start,index]到res中。
7、返回res。
以上是关于56. 合并区间的主要内容,如果未能解决你的问题,请参考以下文章