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