以数组 intervals
表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]
。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
输入:intervals = [[1,3],[2,6],[8,10],[15,18]] 输出:[[1,6],[8,10],[15,18]] 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]
先上我写的第一版代码 大家看看有什么问题
class Solution(object): def merge(self, intervals): intervals.sort(key=lambda x: x[0])#将每个组合进行排序 然后进行组合 for i in range(len(intervals)-1,0,-1): if intervals[i][0]<=intervals[i-1][1]: intervals[i-1][1]=intervals[i][1] del intervals[i] return intervals solution=Solution() result=solution.merge([[1,3],[2,6],[8,10],[15,18]]) print(result)
首先是没有解决覆盖问题 比如 [1,4] [2,3]然后就是 如果输入是下面的数列 其实应该是[1,10]但是输出结果不是
[[2,3],[4,5],[6,7],[8,9],[1,10]]
那么是哪里出了问题呢?当排序之后1.10会在最前面 这个顺序如果是从后往前的 那么1 10会在最后才遍历到 也改变不了之后的结果 所以这个遍历我之前想的是从后遍历不会导致越界 那么其实这个方法是不可行的 然后我又写了一个正序的 这个还是不行有问题 对于I的改变是不对的 其实是如果合并成功了 那么I是不发生移动的 因为万一下一个也是可以的 但是如果没办法合并 那么I才可以移动 所以这个i+=1和if那部分应该是else的关系
class Solution(object): def merge(self, intervals): intervals.sort(key=lambda x: x[0])#将每个组合进行排序 然后进行组合 i=0 while i<len(intervals)-1: if (intervals[i+1][0]<=intervals[i][1]) and (intervals[i+1][0]>=intervals[i][0]): intervals[i][1]=max(intervals[i][1],intervals[i-1][1]) del intervals[i+1] i+=1 return intervals solution=Solution() result=solution.merge([[1,3],[2,6],[8,10],[15,18]]) print(result)
这个是最终正确的代码 其中红色的部分其实我本来是没有这一步的 也是可以顺利通过 但是感觉加上看着更好看点 就加上了
class Solution(object):
def merge(self, intervals):
intervals.sort(key=lambda x: x[0])#将每个组合进行排序 然后进行组合
i=0
while i<len(intervals)-1:
if (intervals[i+1][0]<=intervals[i][1]) :
intervals[i] = [
min(intervals[i][0], intervals[i + 1][0]),#这一步
max(intervals[i][1], intervals[i + 1][1])
]
del intervals[i+1]
else:
i+=1
return intervals
solution=Solution()
result=solution.merge([[1,3],[2,6],[8,10],[15,18]])
print(result)
这个执行速度很差 只是消耗内存超过90多 这里继续留一个坑 看看自己啥时候可以想出来更好的办法
这个帖子就是纯记录一些我自己会出现的一些问题 和也可能会出现同样问题的大家互勉
当然这个解题方法是自己想出来的 并不是很好的方法 大家看到没有学习到什么补药骂我~