lintcode练习-156.合并区间

描述

给出若干闭合区间,合并所有重叠的部分。

您在真实的面试中是否遇到过这个题?  是

样例

Given intervals => merged intervals:

[                     [
  (1, 3),               (1, 6),
  (2, 6),      =>       (8, 10),
  (8, 10),              (15, 18)
  (15, 18)            ]
]

挑战

O(n log n) 的时间和 O(1) 的额外空间。

实现代码:

思路:先对列表按照start进行排序,然后比较,如果end大于等于start,证明区间重复,进行合并。

新区间取res的start, 比较重复区间的大小,取大的一方。

"""
Definition of Interval.
class Interval(object):
    def __init__(self, start, end):
        self.start = start
        self.end = end
"""

class Solution:
    """
    @param intervals: interval list.
    @return: A new interval list.
    """
    '''
    def merge(self, intervals):
        # write your code here
        if len(intervals) < 2:
            return intervals
        
        intervals = sorted(intervals,key= lambda x: x.start)
        res = [intervals[0]]
        i = 1
        k = 0
        while i < len(intervals):
            if res[k].end >= intervals[i].start:
                res[k] = Interval(res[k].start, res[k].end if res[k].end >= intervals[i].end else intervals[i].end)
            else:
                res.append(intervals[i])
                k += 1
            
            i += 1
        
        return res
    '''
    def merge(self, intervals):
        # write your code here
        if len(intervals) < 2:
            return intervals
        
        intervals = sorted(intervals, key=lambda x: x.start)
        
        res = [intervals[0]]
        for interval in intervals:
            if interval.start > res[-1].end:
                res.append(interval)
            elif interval.end > res[-1].end:
                res[-1].end = interval.end
        
        return res
 

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/81388520
156