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

LeetCode 287: Find the Duplicate Number

·1 分鐘· ·
LeetCode Medium Array Two-Pointers Binary-Search Bit-Manipulation
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

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

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

解題思路
#

值在 1..n、共 n + 1 個,把 i -> nums[i] 當成「節點指向下一個」。有兩個 index 指向同一個值,那個值就是環的入口(Linked List 模板三,LC 142):

  1. 快慢指針從 0 出發,相遇在環裡。
  2. 一個回到 0,兩個都一次一步,再相遇的地方就是入口,也就是重複的數。

我的嘗試
#

第一版用 sum(nums) - sum(set(nums)),只在重複剛好兩次時才對,例如 [2, 2, 2, 2]:答案 2,回傳 6。

正確解法
#

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        slow = fast = 0
        while True:
            slow, fast = nums[slow], nums[nums[fast]]
            if slow == fast:
                break
        slow = 0
        while slow != fast:
            slow, fast = nums[slow], nums[fast]
        return slow

複雜度
#

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

要特別避免的錯誤
#

  • 重複的數可能出現不只兩次,sum(nums) - sum(set(nums)) 只在剛好兩次時才對。

面試口說整理
#

把每個 index 指向 nums[i] 會形成一條有環的串列,重複的值就是環的入口。我用 Floyd 判圈:快慢指針先相遇,再讓一個回到起點,兩個一起一步一步走,相遇的地方就是答案。時間 O(n)、空間 O(1)。

相關文章

LeetCode 167: Two Sum II - Input Array Is Sorted
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search
LeetCode 167 解題筆記:已排序,左右指針往中間走:和太大右指針左移,太小左指針右移;回傳的 index 從 1 開始
LeetCode 153: Find Minimum in Rotated Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 153 解題筆記:拿 mid 跟右端比:nums[mid] > nums[r] 代表最小值在右邊,否則 mid 可能就是最小值,r = mid
LeetCode 875: Koko Eating Bananas
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 875 解題筆記:對速度二分,找最小的 k 讓總時數 <= h;時數剛好等於 h 時還要繼續往左找
LeetCode 75: Sort Colors
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting Quicksort
LeetCode 75 解題筆記:荷蘭國旗:low 左邊都是 0、high 右邊都是 2;遇到 2 換到 high 之後不要前進,換過來的數還沒檢查
LeetCode 78: Subsets
·1 分鐘
LeetCode Medium Array Backtracking Bit-Manipulation
LeetCode 78 解題筆記:每個元素選或不選;迭代寫法是每加入一個數,就把現有的每個子集合複製一份並加上它
LeetCode 80: Remove Duplicates from Sorted Array II
·1 分鐘
LeetCode Medium Array Two-Pointers
LeetCode 80 解題筆記:每個值最多留兩個:跟寫入位置往前第二個 nums[k - 2] 比,不一樣才寫