zoukankan      html  css  js  c++  java
  • 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。
  • 相关阅读:
    Http和Socket连接区别
    解决TCP网络传输“粘包”问题
    c# 获取MAC IP TCP列表
    《你不常用的c#之四》:Array的小抽屉ArraySegment
    《你不常用的c#之三》:Action 之怪状
    《你不常用的c#之二》:略谈GCHandle
    c#中var关键字用法
    Combotree--别样的构建层级json字符串
    一周代码秀之[11.18~11.24 linq2xml面向对象]
    这个季节的这些时候
  • 原文地址:https://www.cnblogs.com/panweiwei/p/12723256.html
Copyright © 2011-2022 走看看