题目描述
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]
.
将有重合部分的区间合并。
分析
先将给定的区间按照区间的start参数从小到大排序; 比较相邻区间前者的end和后者的start,若有重合,则合并两个区间:前者的end改为后者的end,删除靠后的区间,给定的区间总个数减1,避免循环体中索引超出范围。
1. sort与sorted:
sort()函数只针对list对象排序,且直接修改原始列表;若指定排序依赖的参数/函数,则按照要求进行排序。
sorted()对所有可迭代对象进行排序,对list排序后会生成新的list。
2. sort与lambda的结合使用:
key指定sort排序时依照的键值,此时可以使用lambda指定key
intervals.sort(key=lambda x: x.start)
3. lambda 的其他用法:
lambda是python将函数赋值给变量的一个操作符。
map(function, iterable, ...)使用函数function,对iterable进行操作;
eg: map(lambda x: x**2, [1,2,3]); 结果为:[1,4,9]
reduce(function,iterable,...)对迭代对象使用function运算,并且将结果累积。取出iterable第一、二个元素使用function运算之后,将结果与第三个元素进行运算;如此类推,直到全部元素运算结束。
eg: reduce(lambda x,y: x+y, [1,2,3,4,5]); 结果为:1+2+3+4+5=15
答案
# 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]
"""
n=len(intervals)
intervals.sort(key=lambda x: x.start) #对所有元组按照开始时间从小到大排序
i=1
while i<n: #循环体限制条件
if intervals[i-1].end>=intervals[i].start: #判断是否存在重合
intervals[i-1].end=max(intervals[i-1].end,intervals[i].end)
del intervals[i] #或者intervals.remove(intervals[i])
n-=1
else: #若该层循环中未删除元组,则索引后移
i+=1
return intervals