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

LeetCode 128: Longest Consecutive Sequence

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

基本資料
#

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

  • 提交紀錄:Wrong Answer ×11 → Accepted ×3

解題思路
#

題目要求 O(n),不能排序。把所有數放進集合(Hash Table),一個數 x 只有在 x - 1 不在集合裡時才是一段連續數字的起點,從它往上數 x + 1, x + 2, ...。每個數只會被當成起點一次、被往上數到一次,總共 O(n)。集合也順便去掉了重複。

我的嘗試
#

這題提交了 14 次,都是「排序後找連續」的版本(不符合 O(n) 的要求):

  • 一開始判斷連續的公式和起始值有錯,[7] 回傳 0。
  • 修好之後,長度直接寫成 max_length = end - start + 1,後面比較短的一段會覆蓋前面比較長的:[4, 5, 7, 8, 3, 0] 排序後 3, 4, 5 長度 3,但回傳 2。
  • 重複的數沒有處理:[4, 3, 3] 回傳 3,答案 2。最後用一個 dup 計數器扣掉重複、長度取 max 才 AC。

正確解法
#

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        s = set(nums)
        best = 0
        for x in s:
            if x - 1 not in s:
                y = x
                while y + 1 in s:
                    y += 1
                best = max(best, y - x + 1)
        return best

複雜度
#

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

要特別避免的錯誤
#

  • 只從起點往上數,否則每個數都往上數會變成 O(n²)。
  • 要在集合上跑迴圈,重複的數只算一次。
  • 排序是 O(n log n),不符合題目要求;排序版本還要處理重複的數,而且長度要取 max,不能直接覆蓋。

面試口說整理
#

我把所有數放進集合,只有 x - 1 不在集合裡的數才是一段連續數字的起點,從起點往上數到斷掉為止,記錄最長的長度。每個數最多被看兩次,時間 O(n)。

相關文章

LeetCode 347: Top K Frequent Elements
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Sorting
LeetCode 347 解題筆記:先計數,再用大小為 k 的 heap 或 bucket sort(次數當 index)取出次數最多的 k 個
LeetCode 73: Set Matrix Zeroes
·1 分鐘
LeetCode Medium Array Hash-Table Matrix
LeetCode 73 解題筆記:先記下哪些列、哪些欄有 0,掃完之後再一起改;進階用第一列、第一欄當標記
LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram
LeetCode 36: Valid Sudoku
·1 分鐘
LeetCode Medium Array Hash-Table Matrix
LeetCode 36 解題筆記:每個數字在列、欄、3 × 3 宮格各只能出現一次;用 (數字, 列)、(數字, 欄)、(數字, 宮格) 當 key 放進同一個集合
LeetCode 167: Two Sum II - Input Array Is Sorted
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search
LeetCode 167 解題筆記:已排序,左右指針往中間走:和太大右指針左移,太小左指針右移;回傳的 index 從 1 開始
LeetCode 238: Product of Array Except Self
·1 分鐘
LeetCode Medium Array Prefix-Sum
LeetCode 238 解題筆記:答案是左邊所有數的乘積乘上右邊所有數的乘積,兩次掃描,不用除法