day05 56. 合併區間 [中等]

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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章