【Leetcode】python - [153] Find Minimum in Rotated Sorted Array 個人解法筆記

整理 LeetCode #153 Find Minimum in Rotated Sorted Array — 二分搜尋、判斷哪邊轉折。

題目出處

153. Find Minimum in Rotated Sorted Array

難度

medium

題目分類

Array, Binary Search

2026-07-24 二刷

個人範例程式碼 - 二刷 (2026/07/24)

class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left < right:
            mid = (left + right) // 2 # left <= mid < right
            if nums[mid] < nums[right]: # ans in left side
                right = mid # mid can be ans (rotation start here)
            else: # ans in right side
                left = mid + 1

        return nums[left]

算法說明

第一次寫的時候我在 nums[mid] < nums[right] 中加了 early return (提前判 asc 而提早回傳答案),
這解法合理但容易讓邏輯不夠乾淨,且 early return 省下的量級不多,還多一層判斷。

可以記憶 left < right 配 right = mid (處理 mid 為答案的情況)

Time Complexity

O(logN)

Space Complexity

O(1)

Boundary conditions

  1. [1]:直接出迴圈
  2. [1,2]:right = mid 能處理
  3. [2,1]:left = mid + 1 能處理
  4. [1,2,3,4]:變 [1,2] 然後同 2.
2022-04-05 一刷

個人範例程式碼 - 一刷 (2022/04/05)

class Solution:
    def findMin(self, nums: List[int]) -> int:
        if not nums:
            return 0

        start, end = 0, len(nums)-1
        while(start + 1 < end):
            mid = (start + end) // 2
            if nums[mid] == nums[end]: # if special case exist
                start = mid
            elif nums[mid] > nums[end]: # still going up
                start = mid
            else: # [mid] < [end] # going down, move start yo get closer
                end = mid
        else:
            if(nums[start] <= nums[end]):
                return nums[start]
            else:
                return nums[end]

算法說明

binary search

最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

input handling

處理沒有輸入的時候,return 0

Boundary conditions

正常的 start, end 要注意,此外

注意點 - 要比較的大小對象? First? Last?

請思考以下問題:

我們的 nums[mid] 應該要比較誰?

(A) > nums[first]
(B) >= nums[first]
(C) > nums[end]
(D) >= nums[end]

思考一下,答案為 (D) >= nums[end]

(B), (C) 基本上代表是同一個意思,而只比較 first 會出問題的地方在於 [2, 3, 1] 與 [1, 2, 3]

正常的 [2, 3, 1],我們可以透過 2 > 1 處理掉,start 往中間移動,
但 [1, 2, 3],我們會發現我們移動了 1 -> 2,start 被移動掉了,因此找不到正確答案。

而 (A) > nums[first],就更不用提了。

Reference

Licensed under CC BY-NC-SA 4.0
最後更新 Jul 24, 2026
使用 Hugo 建立
主題 StackJimmy 設計