DAY23:leetcode #56 Merge Intervals

本文介绍了一种合并区间算法,该算法能够将所有重叠的区间进行合并并返回合并后的区间列表。通过借鉴括号匹配的思想,文章提供了一个具体的实现方案,并对比了不同实现方式的时间复杂度。

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

Subscribe to see which companies asked this question

# Definition for an interval.
# class Interval(object):
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        def comp(x, y):
            if x[0] < y[0]:
                return -1
            elif x[0] > y[0]:
                return 1
            else:
                if x[1] == 's' and y[1] == 'e':
                    return -1
                elif x[1] == 'e' and y[1] == 's':
                    return 1
                else:
                    return 0
        data = []
        result = []
        for intl in intervals:
            data.append((intl.start,'s'))
            data.append((intl.end,'e'))
        data.sort(comp)
        r,r_num = None,0
        for d in data:
            if d[1] == 's':
                if r is None:
                    r = d[0]
                r_num += 1
            if d[1] == 'e':
                r_num -= 1
                if r_num == 0:
                    result.append(Interval(r,d[0]))
                    r = None
        return result
                

这道题主要借鉴了括号匹配思想。将区间开头视为(,区间结束视为)。

有一点注意的是,比如[1,4],[4,5],如果按照括号匹配,则形如()(),但应该交换中间两个括号顺序,改为(()),才能输出[1,5]

算法还有提高空间

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

class Solution:
    # @param intervals, a list of Interval
    # @return a list of Interval
    def merge(self, intervals):
        intervals = sorted(intervals, key=lambda x: x.start)
        result = []
        for interval in intervals:
            if len(result) == 0 or result[-1].end < interval.start:
                result.append(interval)
            else:
                result[-1].end = max(result[-1].end, interval.end)
        return result

看了网上的算法,写得很简洁,但是还是需要排序的,时间复杂度是O(log N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值