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

1103

被折叠的 条评论
为什么被折叠?



