leetcode56. Merge Intervals多種解法-python版

原題

解法一:
思路,先按照對象的end屬性的大小對列表降序排序,(列表內部爲自定義對象時降序的方法可以參考這裏
然後從頭開始比較相鄰的兩個(i 和 i+1)會有以下三種情況

  1. intervals[i].start <= intervals[i+1].end and intervals[i].start >= intervals[i+1].start,這時需要將二者合併
  2. intervals[i].start <= intervals[i+1].end and intervals[i].start < intervals[i+1].start,這時可以將i+1直接刪除
  3. i直接後移即可

代碼:

import functools
class Solution:
    def merge(self, intervals: 'List[Interval]') -> 'List[Interval]':
        intervals = sorted(intervals, key=functools.cmp_to_key(cmp))
        i = 0
        while i < len(intervals)-1:
            if intervals[i].start <= intervals[i+1].end and intervals[i].start >= intervals[i+1].start:
                intervals[i].start = intervals[i+1].start
                del intervals[i+1]
            elif intervals[i].start <= intervals[i+1].end and intervals[i].start < intervals[i+1].start:
                del intervals[i+1]
            else:
                i += 1
        return intervals[: :-1]
    
def cmp(a, b):
    if b.end < a.end:
        return -1
    if a.end < b.end:
        return 1
    return 0

由於是降序排列,所以返回時需要將列表逆置,這樣就會一定程度上增加運行時間。但是如果不降序排列的話,按照end升序排列我沒有想到好的辦法,希望在這個方向上有想法的小夥伴告知我一聲。

方法二:來源於leetcode
新建列表out,按照start升序排列,從頭開始遍歷,如果Intervals[i].start<=out[-1].end,將out[-1].end更新爲max(Intervals[i].end,out[-1].end),否則將Intervals[i]添加進列表out,就問你簡單不??

def merge(self, intervals):
    out = []
    for i in sorted(intervals, key=lambda i: i.start):
        if out and i.start <= out[-1].end:
            out[-1].end = max(out[-1].end, i.end)
        else:
            out += i,
    return out
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章