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

LeetCode 540: Single Element in a Sorted Array

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

基本資料
#

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

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

解題思路
#

在單獨的元素之前,每一對的第一個都在偶數 index;在它之後,每一對的第一個都在奇數 index(Binary Search)。把 mid 調成偶數,看 nums[mid] == nums[mid + 1]:

  • 相等:前面都是完整的對,答案在右邊,l = mid + 2。
  • 不相等:答案在 mid 或左邊,r = mid。

我的嘗試
#

我當時是每兩個一組掃過去(O(n),題目要求 O(log n))。前兩版沒處理「單獨的在最後一個」:迴圈跑完沒有回傳值,例如 [7, 7, 8] 回傳 None,答案 8;只有一個元素 [3] 時也一樣。

正確解法
#

class Solution:
    def singleNonDuplicate(self, nums: List[int]) -> int:
        l, r = 0, len(nums) - 1
        while l < r:
            mid = (l + r) // 2
            if mid % 2:
                mid -= 1                                # 調成偶數
            if nums[mid] == nums[mid + 1]:
                l = mid + 2
            else:
                r = mid
        return nums[l]

複雜度
#

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

要特別避免的錯誤
#

  • 題目要求 O(log n);每兩個一組掃過去是 O(n)。
  • 單獨的那個在最後一個時,迴圈裡找不到,要另外回傳。

面試口說整理
#

單獨的元素前面每一對都從偶數位置開始,所以我把 mid 調成偶數,看它跟下一個是不是一樣:一樣代表答案在右邊,不一樣代表在 mid 或左邊。時間 O(log n)。

相關文章

LeetCode 275: H-Index II
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 275 解題筆記:引用數已排序,找第一個 citations[i] >= n - i 的位置,答案是 n - i;用二分做到 O(log n)
LeetCode 611: Valid Triangle Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Greedy
LeetCode 611 解題筆記:排序後固定最長邊 k,左右指針找兩短邊:和夠大時中間的都可以,一次加 j - i 個
LeetCode 240: Search a 2D Matrix II
·1 分鐘
LeetCode Medium Array Binary-Search Divide-and-Conquer Matrix
LeetCode 240 解題筆記:從右上角開始,比目標大就往左、比目標小就往下,每一步排除一整列或一整欄
LeetCode 162: Find Peak Element
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 162 解題筆記:nums[mid] < nums[mid + 1] 代表右邊一定有山峰(一路上升最後也會碰到邊界),否則左邊(含 mid)一定有
LeetCode 287: Find the Duplicate Number
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search Bit-Manipulation
LeetCode 287 解題筆記:把 i -> nums[i] 看成鏈結串列,重複的值就是環的入口,用 Floyd 判圈;O(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