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

題目出處

153. Find Minimum in Rotated Sorted Array

難度

medium

個人範例程式碼

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