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

LeetCode 448: Find All Numbers Disappeared in an Array

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

基本資料
#

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

  • 提交紀錄:Accepted ×2

解題思路
#

值都在 1..n,可以把陣列本身當雜湊表(Hash Table 模板二):看到 x 就把 nums[abs(x) - 1] 變成負數,表示 x 出現過。用 abs 是因為那格可能已經被標成負數。最後 nums[i] > 0 的位置,i + 1 就沒出現過。O(1) 額外空間。

我的嘗試
#

兩次都一次 AC,第一次就是用上面這個「標成負數」的寫法。

正確解法
#

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        for x in nums:
            i = abs(x) - 1
            nums[i] = -abs(nums[i])
        return [i + 1 for i, x in enumerate(nums) if x > 0]

複雜度
#

時間 O(n),空間 O(1)(不算輸出)。

要特別避免的錯誤
#

  • 讀值的時候要取 abs,那格可能已經被標成負數。
  • 標記要寫成 -abs(...),同一個數出現兩次時不能翻回正的。

面試口說整理
#

值都在 1 到 n,我把陣列本身當雜湊表,看到 x 就把第 x - 1 格標成負數,最後還是正數的位置加一就是沒出現的數。額外空間 O(1)。

相關文章

LeetCode 268: Missing Number
·1 分鐘
LeetCode Easy Array Hash-Table Math Binary-Search
LeetCode 268 解題筆記:0 到 n 的總和減掉陣列總和就是缺的那個;缺的可能是 0
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 1: Two Sum
·1 分鐘
LeetCode Easy Array Hash-Table
LeetCode 1 解題筆記:一邊掃一邊把看過的數存進雜湊表,查 target - x 有沒有出現過;先查再存,同一個元素才不會用兩次
LeetCode 349: Intersection of Two Arrays
·1 分鐘
LeetCode Easy Array Hash-Table Two-Pointers Binary-Search
LeetCode 349 解題筆記:兩個陣列各轉成集合取交集