今天在LeetCode上面做了一道排序题:合并区间。该题也不算太难,先用非常暴力的方法解决了。该步骤如下:
1.初始化每一个区间的最小值min与最大值max
2.遍历所有区间,找到区间下限最小的那个,并用min,max记入。
3.删除步骤2找到的区间
4.遍历剩下的所有区间,如果该区间的最小值小于或等于步骤2中的最大值,记入该区间的最大值。
5.如果该区间的最大值大于max,那么max 就等于该最大值。
6.重复步骤4,5若干次,并在结束后删除所有符合步骤4的区间,添加【min,max】为合并后的区间
7.但剩下的区间数大于零时,重复操作上述过程
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
lists = []
while (len(intervals)>0):
min = 100000
index = 0
for a in range(len(intervals)):
if min> intervals[a][0]:
min = intervals[a][0]
max = intervals[a][1]
index = a
intervals.remove(intervals[index])
n = 10
while(n):
re = []
for a in range(len(intervals)):
if max >= intervals[a][0]:
if max <= intervals[a][1]:
max = intervals[a][1]
re.append(intervals[a])
n -= 1
intervals = [a for a in intervals if a not in re]
lists.append([min,max])
return lists
上述操作没有涉及的如何算法的思想,下面让我们在用另外一种操作,先按区间的最小值排好序,然后再遍历。排序后可以合并的区间是连续的,这样就省去了上面的步骤6的重复操作4,5,从而提高了程序的效率。
具体步骤就不写了,基本与上面的相似。
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort(key=lambda x: x[0])
merges = []
for a in intervals:
if not merges or merges[-1][-1] < a[0]:
merges.append(a)
else:
if merges[-1][-1] < a[-1]:
merges[-1][-1] = a[-1]
return merges
Thank for your time !! ,
ps: 参考LeetCode官方解析。