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

LeetCode 228: Summary Ranges

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

基本資料
#

難易度: easy 第一次嘗試:2022-08-21

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

解題思路
#

維護一個區間的 list:新的數 x 如果等於最後一個區間的結尾加一,就延長那個區間;否則新開一個 [x, x]。最後把 a == b 的區間寫成 "a",其他寫成 "a->b"。這樣不用特別處理最後一段,也不用處理空陣列。

我的嘗試
#

這題提交了 15 次:

  • 前幾版只在「和下一個數差超過 1」時輸出區間,最後一段永遠沒輸出,空陣列還回傳 None:[3] 回傳 []。
  • 改成用 index 處理最後一個元素之後,又一直存取 nums[i + 1] 超出範圍。
  • 先 AC 的是一個特判很多的版本;最後重寫成「接得上就延長最後一個區間」,邊界問題就都不見了。

正確解法
#

class Solution:
    def summaryRanges(self, nums: List[int]) -> List[str]:
        ranges = []
        for x in nums:
            if ranges and ranges[-1][1] == x - 1:
                ranges[-1][1] = x
            else:
                ranges.append([x, x])
        return [str(a) if a == b else f"{a}->{b}" for a, b in ranges]

複雜度
#

時間 O(n),空間 O(n)(輸出)。

要特別避免的錯誤
#

  • 最後一段要輸出。
  • 空陣列回傳空 list,不是 None。
  • 只有一個數的區間寫成 "a"。

面試口說整理
#

我掃一次,維護區間的 list,新的數接得上最後一個區間就延長,否則開新的區間,最後把每個區間轉成字串。時間 O(n)。

相關文章

LeetCode 217: Contains Duplicate
·1 分鐘
LeetCode Easy Array Hash-Table Sorting
LeetCode 217 解題筆記:轉成 set 後長度變短就代表有重複
LeetCode 219: Contains Duplicate II
·1 分鐘
LeetCode Easy Array Hash-Table Sliding-Window
LeetCode 219 解題筆記:雜湊表記錄每個值最後一次出現的位置,只需要跟最近的那次比距離
LeetCode 169: Majority Element
·1 分鐘
LeetCode Easy Array Hash-Table Divide-and-Conquer Sorting
LeetCode 169 解題筆記:Boyer-Moore 投票,不同的數兩兩抵消,最後留下的就是出現超過一半的那個
LeetCode 108: Convert Sorted Array to Binary Search Tree
·1 分鐘
LeetCode Easy Array Divide-and-Conquer Tree Binary-Search-Tree
LeetCode 108 解題筆記:中間的元素當根,左右兩半遞迴;左右大小最多差 1,自然是平衡的
LeetCode 119: Pascal's Triangle II
·1 分鐘
LeetCode Easy Array Dynamic-Programming
LeetCode 119 解題筆記:只要第 rowIndex 列,用一維陣列從右往左更新,空間 O(k)
LeetCode 27: Remove Element
·1 分鐘
LeetCode Easy Array Two-Pointers
LeetCode 27 解題筆記:寫入指標只寫不等於 val 的數,最後回傳寫入的個數