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