题目分析:
这一题是给定一些区间让我们合并有共同区域的区间,例如[[1,3],[2,6],[8,10],[15,18]]
输出[[1,6],[8,10],[15,18]]
,这一题我们要先针对区间排序,可以建立两个标记去标记上一个区间,然后对区间两个端点创建节点加入res,或者直接对传入的数组做修改。
测试代码(提交代码在下面):
def print_i_list(i_list):
for i in i_list:
print([i.start, i.end], end=' ')
print()
class Interval:
def __init__(self, s=0, e=0):
self.start = s
self.end = e
class Solution:
def merge(self, intervals):
if intervals == []: return []
intervals.sort(key=lambda x: (x.start))
i, res, length = 1, [], len(intervals)
s, e = intervals[0].start, intervals[0].end
while(i < length):
if e >= intervals[i].start:
s = min(s, intervals[i].start)
e = max(e, intervals[i].end)
else:
res.append(Interval(s, e))
s = intervals[i].start
e = intervals[i].end
i += 1
res.append(Interval(s, e))
return res
[[1,3],[2,6],[8,10],[15,18]]
i1_1 = Interval(1, 3)
i1_2 = Interval(2, 6)
i1_3 = Interval(8, 10)
i1_4 = Interval(15, 18)
i_list1 = [i1_1, i1_2, i1_3, i1_4]
print_i_list(i_list1)
print_i_list(Solution().merge(i_list1))
提交代码1
class Solution:
def merge(self, intervals):
if intervals == []: return []
intervals.sort(key=lambda x: (x.start))
i, res, length = 1, [], len(intervals)
s, e = intervals[0].start, intervals[0].end
while(i < length):
if e >= intervals[i].start:
s = min(s, intervals[i].start)
e = max(e, intervals[i].end)
else:
res.append(Interval(s, e))
s = intervals[i].start
e = intervals[i].end
i += 1
res.append(Interval(s, e))
return res
提交代码2
class Solution:
def merge(self, intervals):
intervals.sort(key=lambda x: (x.start))
length, i = len(intervals), 1
while(i < length):
if intervals[i].start <= intervals[i - 1].end:
intervals[i - 1].end = max(intervals[i - 1].end, intervals[i].end)
intervals.pop(i)
length -= 1
i -= 1
i += 1
return intervals