解法一:
思路,先按照对象的end属性的大小对列表降序排序,(列表内部为自定义对象时降序的方法可以参考这里)
然后从头开始比较相邻的两个(i 和 i+1)会有以下三种情况
- intervals[i].start <= intervals[i+1].end and intervals[i].start >= intervals[i+1].start,这时需要将二者合并
- intervals[i].start <= intervals[i+1].end and intervals[i].start < intervals[i+1].start,这时可以将i+1直接删除
- i直接后移即可
代码:
import functools
class Solution:
def merge(self, intervals: 'List[Interval]') -> 'List[Interval]':
intervals = sorted(intervals, key=functools.cmp_to_key(cmp))
i = 0
while i < len(intervals)-1:
if intervals[i].start <= intervals[i+1].end and intervals[i].start >= intervals[i+1].start:
intervals[i].start = intervals[i+1].start
del intervals[i+1]
elif intervals[i].start <= intervals[i+1].end and intervals[i].start < intervals[i+1].start:
del intervals[i+1]
else:
i += 1
return intervals[: :-1]
def cmp(a, b):
if b.end < a.end:
return -1
if a.end < b.end:
return 1
return 0
由于是降序排列,所以返回时需要将列表逆置,这样就会一定程度上增加运行时间。但是如果不降序排列的话,按照end升序排列我没有想到好的办法,希望在这个方向上有想法的小伙伴告知我一声。
方法二:来源于leetcode
新建列表out,按照start升序排列,从头开始遍历,如果Intervals[i].start<=out[-1].end,将out[-1].end更新为max(Intervals[i].end,out[-1].end),否则将Intervals[i]添加进列表out,就问你简单不??
def merge(self, intervals):
out = []
for i in sorted(intervals, key=lambda i: i.start):
if out and i.start <= out[-1].end:
out[-1].end = max(out[-1].end, i.end)
else:
out += i,
return out