LeetCode-剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。

给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。

class Solution:
    def minArray(self, numbers: List[int]) -> int:
        num = len(numbers)
        left = 0
        right = num - 1
        mid = left
        while numbers[left] >= numbers[right]:
        	# left和right相邻时退出
            if right - left == 1:
                mid = right
                break
            
            mid = (right + left) // 2

			# 特殊情况,左中右都相等,只能顺序判断
            if numbers[mid] == numbers[left] and numbers[left] == numbers[right]:
                mid = self.normal(numbers, left, right)
                break

            if numbers[mid] >= numbers[left]:
                left = mid
            elif numbers[mid] <= numbers[right]:
                right = mid
        
        return numbers[mid]

    def normal(self, numbers, left, right):
        minnum = 0
        for n in range(left, right, 1):
            if numbers[n] < numbers[n+1]:
                minnum = n
        return minnum
posted @ 2022-03-11 19:58  小Aer  阅读(2)  评论(0编辑  收藏  举报  来源