↓快轉到主要內容
  1. LeetCode/

LeetCode 56: Merge Intervals

·1 分鐘· ·
LeetCode Medium Array Sorting Quicksort
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-22

  • 提交紀錄:Wrong Answer ×3 → Accepted → Runtime Error → Wrong Answer ×2 → Accepted → Wrong Answer → Accepted ×3 → Runtime Error ×2 → Accepted ×3

解題思路
#

按起點排序後,能合併的區間一定相鄰(Greedy 模板二)。維護結果的最後一個區間:新區間 start <= res[-1][1] 就合併,終點取 max(新的可能被包在裡面);否則另開一個。要跟已經合併好的最後一個比,不是跟原本的前一個區間比。

我的嘗試
#

這題從 2022 年寫到 2026 年,錯了 9 次,每次錯在一個條件:

  • 跟原本的前一個區間比,不是跟合併好的結果比:[[2, 2], [1, 5], [4, 7]] 排序後是 [1, 5], [2, 2], [4, 7],4 跟 [2, 2] 比沒有重疊,回傳 [[1, 5], [4, 7]]。
  • 用 < 而不是 <=:[[0, 2], [2, 3]] 沒合併。
  • 迴圈從 1 開始,第一個區間沒放進結果:[[5, 5]] 回傳 [];append(intervals) 把整個 list 放進去。
  • 2022-10-31 重寫時合併的終點直接用新區間的終點,被包住的區間把終點縮短了:[[6, 9], [7, 8]] 回傳 [[6, 8]]。

正確解法
#

class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort()
        res = []
        for s, e in intervals:
            if res and s <= res[-1][1]:
                res[-1][1] = max(res[-1][1], e)
            else:
                res.append([s, e])
        return res

複雜度
#

時間 O(n log n),空間 O(n)。

要特別避免的錯誤
#

  • 碰到端點也要合併:[0, 2] 和 [2, 3] 用 <=。
  • 終點取 max,被包住的區間不能把終點縮短。
  • 比較的對象是結果的最後一個,不是原本陣列的前一個。

面試口說整理
#

我按起點排序,能合併的區間一定相鄰,所以維護結果的最後一個區間,新的起點不超過它的終點就合併、終點取較大值,否則另開一個。時間 O(n log n)。

相關文章

LeetCode 47: Permutations II
·1 分鐘
LeetCode Medium Array Backtracking Sorting
LeetCode 47 解題筆記:先排序,同一層如果跟前一個值相同而且前一個還沒被用,就跳過
LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram
LeetCode 15: 3Sum
·2 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 15 解題筆記:排序後固定第一個數,剩下用對撞指針找兩數和;三個位置都要跳過相同的值,才不會有重複的組合
LeetCode 16: 3Sum Closest
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 16 解題筆記:排序後固定一個數,對撞指針找另外兩個;比較的是和跟 target 的距離 abs(sum - target)
LeetCode 18: 4Sum
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 18 解題筆記:排序後兩層迴圈固定前兩個數,剩下用對撞指針;四個位置都要跳過相同的值
LeetCode 54: Spiral Matrix
·1 分鐘
LeetCode Medium Array Matrix Simulation
LeetCode 54 解題筆記:維護上下左右四個邊界,依序走右、下、左、上,每走完一邊就把那個邊界往內縮