思路
举例:
[[1, 9], [2, 5], [19, 20], [10, 11], [12, 20], [0, 3], [0, 1], [0, 2]]
根据第一个元素进行升序排列
ls1 = [[5, 0, 3], [6, 0, 1], [7, 0, 2], [0, 1, 9], [1, 2, 5], [3, 10, 11], [4, 12, 20], [2, 19, 20]]
根据第二个元素进行升序排列
ls2 = [[6, 0, 1], [7, 0, 2], [5, 0, 3], [1, 2, 5], [0, 1, 9], [3, 10, 11], [2, 19, 20], [4, 12, 20]]
ls1中[5, 0, 3]右边所有元素的第一个元素都比它要小
ls2中[5, 0, 3]左边所有元素的第二个元素都比它的第二个元素要小,左边边所有元素的第一个元素都比它的第一个元素要大,所以ls2中[5, 0, 3]左边所有元素都被包括在[0, 3]中
将ls2中[5, 0, 3]左边所有元素从ls1和ls2中删除,将[5, 0, 3]保存在 t 中然后也从ls1和ls2中删除
删除后:
ls1 = [[0, 1, 9], [1, 2, 5], [3, 10, 11], [4, 12, 20], [2, 19, 20]]
ls2 = [[1, 2, 5], [0, 1, 9], [3, 10, 11], [2, 19, 20], [4, 12, 20]]
ls1中[0, 1, 9]右边所有元素的第一个元素都比它要小
ls2中[0, 1, 9]左边所有元素的第二个元素都比它的第二个元素要小,左边边所有元素的第一个元素都比它的第一个元素要大,所以ls2中[0, 1, 9]左边所有元素都被包括在[1, 9]中
将ls2中[0, 1, 9]左边所有元素从ls1和ls2中删除,将[0, 1, 9]保存在 t 中然后也从ls1和ls2中删除
删除后:
ls1 = [[3, 10, 11], [4, 12, 20], [2, 19, 20]]
ls2 = [[3, 10, 11], [2, 19, 20], [4, 12, 20]]
依次迭代可以得到[3, 10, 11]、[4, 12, 20],保存在 t 中
t = [[5, 0, 3], [0, 1, 9], [3, 10, 11], [4, 12, 20]]
这样得到的 t 能保证 t 中前后两元素不存在包含关系
遍历t,若前一个元素的第二个元素大于后一个元素第一个元素则将两者融合
最后得到结果
代码
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
flag=0
for i in intervals:
i.insert(0,flag)
flag=flag+1
sorted0_intervals = sorted(intervals, key = lambda x:x[1])
sorted1_intervals = sorted(intervals, key = lambda x:x[2])
print(sorted0_intervals)
t = []
i = 0
while i < len(sorted0_intervals):
t.append(sorted0_intervals[i])
for j in range(len(sorted0_intervals)-1,-1,-1):
if sorted0_intervals[i] == sorted1_intervals[j]:
i = j + 1
break
i = 0
while i < len(t)-1:
if t[i][2] >= t[i+1][1]:
t[i+1][1] = t[i][1]
del t[i]
else:
i = i + 1
ret = []
for i in t:
ret.append([i[1],i[2]])
return ret
#字典数据类型降低搜索时间