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

 

 

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