码迷,mamicode.com
首页 > 其他好文 > 详细

56. 合并区间

时间:2020-04-17 23:40:38      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:区间   type   col   index   alt   http   取出   obj   main   

技术图片

方法一:思路见注释。

 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. 合并区间

标签:区间   type   col   index   alt   http   取出   obj   main   

原文地址:https://www.cnblogs.com/panweiwei/p/12723256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!