1.题目描述 56. 合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
2.思路分析
这个问题整理还是比较简单的,先排序,根据排序后数组依序向后合并即可
3.debug过程
3.1 合并两个有序区间的时候,忽略了第二个区间可能是第一个子集的情况,也就是合并后的结束不一定是第二个元素
3.2 用python系统自带的sort比自己实现的快排要快一倍,这个暂时还不知道原因,后续再分析
3.3 快排实现确实是一个难点,整体思路不难,难在游标处理的debug过程,稍不注意就会有case不能通过
4.提交结果
4.1 自己实现的快排
执行用时 :116 ms, 在所有 Python 提交中击败了10.02%的用户
内存消耗 :13.9 MB, 在所有 Python 提交中击败了100.00%的用户
4.2 用系统的sort
60 ms | 13.9 MB |
5.ac代码(python)
def quick_sort_wrapper(lists, key=None):
quick_sort(lists, 0, len(lists)-1, key)
def quick_sort(lists, start_idx, end_idx, lambda_func=None):
if not lambda_func:
lambda_func = lambda a : a
if start_idx >= end_idx:
return
# 快排,从小到大
flag = lists[start_idx]
i = start_idx + 1
j = end_idx
while i <= j:
while i < j and lambda_func(lists[i]) <= lambda_func(flag):
i += 1
while j >= i and lambda_func(lists[j]) >= lambda_func(flag):
j -= 1
if j <= i:
break
tmp = lists[i]
lists[i] = lists[j]
lists[j] = tmp
lists[start_idx] = lists[j]
lists[j] = flag
quick_sort(lists, start_idx, j-1)
quick_sort(lists, i, end_idx)
class Solution(object):
def combine_lists(self, list1, list2):
# 合并两个第一个元素有序集合区间,若可合并返回成功标志和合并后数组
if list1[0] <= list2[0] <= list1[1]:
return True, [list1[0], max(list1[1], list2[1])]
else:
return False, None
def merge(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: List[List[int]]
思路:
1.先排序
2.idx从0开始不断和下一个合并,若无法合并idx+=1,若合并成功,idx不变
"""
# intervals.sort(key=lambda a:a[0])
quick_sort_wrapper(intervals, key=lambda a:a[0])
idx = 0
while idx < len(intervals) - 1:
is_combined, combined_array = self.combine_lists(intervals[idx], intervals[idx+1])
if is_combined:
del intervals[idx]
del intervals[idx]
intervals.insert(idx, combined_array)
else:
idx += 1
return intervals