1. 程式人生 > >Leetcode 154:尋找旋轉排序陣列中的最小值 II(最詳細的解法!!!)

Leetcode 154:尋找旋轉排序陣列中的最小值 II(最詳細的解法!!!)

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請找出其中最小的元素。

注意陣列中可能存在重複的元素。

示例 1:

輸入: [1,3,5]
輸出: 1

示例 2:

輸入: [2,2,2,0,1]
輸出: 0

說明:

  • 允許重複會影響演算法的時間複雜度嗎?會如何影響,為什麼?

解題思路

  • l<=mid>rl<=mid>r
  • l>mid<=rl>mid<=r
  • l<=mid<=rl<=mid<=r

但是我們在處理最後一種情況時有所變化,不再是直接返回nums[low],因為我們會碰到這樣的情況

3 3 1 3

我們採用之前問題的第二種處理思路,也就是壓縮空間,那麼怎麼壓縮呢?我們知道對於第三種情況最小值可能出現在mid的右側,也可能出現在low或者恰好在mid位置,所以對於這種情況我們直接high--即可。

class Solution:
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
low, high = 0, len(nums) - 1 while low <= high: mid = (low + high) // 2 if nums[low] <= nums[mid]: if nums[mid] <= nums[high]: high -= 1 else: low = mid + 1 else: if
nums[mid] <= nums[high]: high = mid return nums[low]

如有問題,希望大家指出!!!