【LintCode 简单】156. 合并区间

1.问题描述:

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

 

2.样例:

样例1:

输入: [(1,3)]
输出: [(1,3)]
样例 2:

输入:  [(1,3),(2,6),(8,10),(15,18)]
输出: [(1,6),(8,10),(15,18)]

3.代码:

"""
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:  # 数组长度小于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

 

注意:给的原始intervals中可能并不是按照start有序排列的,所以一开始需要做一个排序的工作。这里利用sorted函数,key的话就是排序的元素,这里是需要比较start的值。

sorted(iterable, cmp=None, key=None, reverse=False)

参数说明如下:

  • iterable -- 可迭代对象。
  • cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

在对原始intervals排序之后,就循环从第一个开始。如果interval的end小于下一个interval的start则不会进行合并,否则就需要进行合并操作。合并操作中的新interval的end需要进行判断。

 

参考资料:

1. https://www.jianshu.com/p/c7b70cbb3df0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值