劍指offer:11. 旋轉數組的最小數字

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如,數組 [3,4,5,1,2] 爲 [1,2,3,4,5] 的一個旋轉,該數組的最小值爲1。

示例 1:
輸入:[3,4,5,1,2]
輸出:1

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

考點: 半有序數組中找最小值
思路:

  • 使用自帶的min函數
  • 暴力遍歷找最小值
  • 利用好旋轉數組的半有序,使用二分查找法,左邊有序,右邊有序,中間一點是最小值。中間值與最後一個值比較,如果中間值大於最後一個值,表明中間值在前一段有序中,需要將left進行移動,left變爲mid+1。如果中間值小於最後一個值,表明中間值在後面一段有序中,需要將right進行移動,right變爲mid。如果中間值等於最後一個值,則將right左移動一位。最終返回nums[left]
class Solution:
    def minArray(self, numbers: List[int]) -> int:
        if numbers is None or len(numbers) < 1:
            return None
        # 使用自帶的函數
        '''
        return min(numbers)
        '''
        # 暴力法,挨個比較, 沒有用到旋轉數組排序的信息
        '''
        min_val = numbers[0]
        for num in numbers[1:]:
            if num < min_val:
                min_val = num
        return min_val
        '''
        # 二分查找
        left = 0
        right = len(numbers) - 1
        while left < right:
            mid = left + (right - left) // 2
            if numbers[mid] > numbers[right]:
                left = mid + 1
            elif numbers[mid] < numbers[right]:
                right = mid
            else:
                right -= 1
        return numbers[left]

鏈接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章