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

LeetCode 645: Set Mismatch

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

基本資料
#

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

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

解題思路
#

陣列本來應該是 1..n,其中一個數重複、一個數不見。set(nums) 去掉重複後少了 missing:missing = n(n + 1) / 2 - sum(set);陣列總和比 set 多了 duplicate:duplicate = sum(nums) - sum(set)。不用排序也不用比較位置(Hash Table)。O(1) 空間的作法是把所有數和 1..n 一起 XOR,得到 dup ^ miss,再用最低的 1 分組(Bit Manipulation)。

我的嘗試
#

這題提交了 17 次,前十幾次都在「比較 nums[i] 和 i + 1」:

  • 陣列沒有排序,比較 nums[i] 和 nums[i - 1]、或 nums[i] 和 i + 1 都沒有意義:[2, 2] 回傳 [2, 1, 2] 或 [1, 2],好幾版還忘了 return。
  • 先排序再找「值和位置不同」的地方,錯位的不只一個:[3, 3, 1] 排序後是 [1, 3, 3],第 2、3 格都不對,回傳 [3, 2, 3, 3] 之類的結果。
  • 最後改成排序找重複、用 set 的差集找缺少的數才 AC,之後又改成用總和計算。

正確解法
#

class Solution:
    def findErrorNums(self, nums: List[int]) -> List[int]:
        n = len(nums)
        uniq = sum(set(nums))
        return [sum(nums) - uniq, n * (n + 1) // 2 - uniq]

複雜度
#

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

要特別避免的錯誤
#

  • 陣列沒有排序,不能直接比較 nums[i] 和 i + 1。
  • 排序後也不是只有一個位置不對:重複和缺少之間的元素都會錯位。
  • 回傳的順序是 [duplicate, missing]。

面試口說整理
#

set 去掉重複之後少了 missing,陣列總和比 set 多了 duplicate,所以我用 1 到 n 的和減掉 set 的和得到 missing,用陣列總和減掉 set 的和得到 duplicate。時間 O(n)。

相關文章

LeetCode 389: Find the Difference
·1 分鐘
LeetCode Easy Hash-Table String Bit-Manipulation Sorting
LeetCode 389 解題筆記:t 比 s 多一個字元,把兩個字串的所有字元 XOR 起來,成對的抵消,剩下的就是多的那個
LeetCode 217: Contains Duplicate
·1 分鐘
LeetCode Easy Array Hash-Table Sorting
LeetCode 217 解題筆記:轉成 set 後長度變短就代表有重複
LeetCode 169: Majority Element
·1 分鐘
LeetCode Easy Array Hash-Table Divide-and-Conquer Sorting
LeetCode 169 解題筆記:Boyer-Moore 投票,不同的數兩兩抵消,最後留下的就是出現超過一半的那個
LeetCode 594: Longest Harmonious Subsequence
·1 分鐘
LeetCode Easy Array Hash-Table Sliding-Window Sorting
LeetCode 594 解題筆記:子序列不用連續,所以只要計數,每個 x 看 x 和 x + 1 的次數加起來
LeetCode 628: Maximum Product of Three Numbers
·1 分鐘
LeetCode Easy Array Math Sorting
LeetCode 628 解題筆記:排序後答案只有兩種可能:最大的三個相乘,或最小的兩個(負數)乘最大的一個
LeetCode 599: Minimum Index Sum of Two Lists
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 599 解題筆記:把 list1 的字串對應到 index,掃 list2 時算兩邊 index 的和,留下和最小的全部字串