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

LeetCode 81: Search in Rotated Sorted Array II

·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-10-26

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

解題思路
#

跟 LC 33 一樣判斷哪一半有序,但多了重複值(Binary Search)。nums[l] == nums[mid] 時,例如 [1, 1, 1, 3, 1],分不出左半是不是有序,只能把 l 往右移一格再試。全部都一樣的時候會退化成 O(n)。

我的嘗試
#

這題 2022 年提交了 19 次,幾乎都是 WA:

  • 一開始只用 nums[r] >= target / nums[l] <= target 決定方向,沒有先判斷哪一半有序,例如 [2, 2, 3, 0]、target = 3 回傳 False。
  • 加上有序判斷後,沒有處理 nums[l] == nums[mid],有重複值時判斷錯哪一半有序,例如 [1, 2, 3, 1, 1, 1, 1]、target = 2 回傳 False。
  • 一版函式最後沒有回傳值,一版回傳了 -1 而不是 False。

正確解法
#

class Solution:
    def search(self, nums: List[int], target: int) -> bool:
        l, r = 0, len(nums) - 1
        while l <= r:
            mid = (l + r) // 2
            if nums[mid] == target:
                return True
            if nums[l] == nums[mid]:                     # 分不出哪一半有序
                l += 1
            elif nums[l] < nums[mid]:                    # 左半有序
                if nums[l] <= target < nums[mid]:
                    r = mid - 1
                else:
                    l = mid + 1
            else:                                        # 右半有序
                if nums[mid] < target <= nums[r]:
                    l = mid + 1
                else:
                    r = mid - 1
        return False

複雜度
#

平均 O(log n),最壞 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 重複值讓 nums[l] == nums[mid] 時無法判斷,只能縮一格。

面試口說整理
#

跟沒有重複時一樣先判斷哪一半有序,但 nums[l] 等於 nums[mid] 時分不出來,只能把左界往右移一格。平均 O(log n),全部一樣時是 O(n)。

相關文章

LeetCode 74: Search a 2D Matrix
·1 分鐘
LeetCode Medium Array Binary-Search Matrix
LeetCode 74 解題筆記:每列接上一列是完整排序的,把矩陣當成長度 m × n 的一維陣列二分,mid 換成 (mid // n, mid % n)
LeetCode 33: Search in Rotated Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 33 解題筆記:旋轉後 mid 的左右一定有一邊是排序好的,判斷目標在不在那一邊,在就往那邊找,不在就去另一邊
LeetCode 34: Find First and Last Position of Element in Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 34 解題筆記:做兩次 lower bound:第一個 >= target 的位置,以及第一個 >= target + 1 的位置減一
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 79: Word Search
·2 分鐘
LeetCode Medium Array String Backtracking Depth-First-Search
LeetCode 79 解題筆記:從每一格開始回溯,往四個方向比對下一個字元,走過的格子暫時標記,回溯時還原;先用字元次數剪枝