这道题只要能发现一个规律就能做出来:如果列表中每一个子列表的第一个元素是升序的,那么只要前一个子列表的第二位元素比后一个子列表的第一位元素大,就可以将这两个子列表(区间)进行合并,举个例子,如果[1,3]和[2,6],这两个区间的第一位分别是1和2满足升序,那么[1,3]中第二位元素3>[2,6]中第一位元素,即可以将这两个区间合并为[1,6]
那么我们应该怎么实现呢?难道要遍历intervals数组的同时在内部不断合并吗?这样也太麻烦了,何不构建一个列表merge,在遍历intervals的同时将此时的子列表与merge中合并的区间列表不断比较,生成最终结果呢
实现过程:
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
# 用数组merged存储最终的答案,首先,我们将列表中的区间按照左端点升序排序。然后我们将第一个区间加入merged数组中,并按顺序依次考虑之后的每个区间
# 如果当前区间的左端在在数组merged中最后一个区间的右端点之后,那么他们不会重合,我们可以直接将这个区间加入数组megerd的末尾
# 否则,它们重合,我们需要用当前区间的右端点更新数组merged中最后一个区间的右端点,将其置为二者的较大值。
# 不用考虑两个区间的左端点了,因为已经按顺序排列了
merge = []
intervals.sort(key=lambda x:x[0])
for interval in intervals:
# 如果列表为空,或者当前区间与上一区间不重合,则直接添加
if not merge or merge[-1][1]<interval[0]:
merge.append(interval)
# 否则,我们可以与上一区间进行合并,只要合并的时候我们已经确定好了下限(第一维),只要确定上限(第二位)就好了
else:
merge[-1][1]= max(merge[-1][1],interval[1])
return merge