把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [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
class Solution:
def minArray(self, numbers: List[int]) -> int:
# 一个排序好的数组旋转,会得到两个排序好的数组,左排序好的数组称为左数组,右面排序好的数组为右数组。
# i,j指向numbers中左右数组两部分,当两个指针相同的时候,得到了旋转点,就是旋转数组的最小数字
# 使用二分查找的方法,左右夹逼得到最后想要的值
i = 0
num_len = len(numbers)
if num_len == 0:
return -1
j = num_len - 1
while( i != j):
m = (i + j) // 2
# print(m, i, j)
# 如果i,j中点m的对应的值小于j,说明m点一定在右数组中,更新j为m
if( numbers[m] < numbers[j]):
j = m
# 如果m中点对应的值大于等于j对应的值,说明m位于左数组中,i = m + 1也不会漏掉有效解,换句话说就是最小点一定在m点之后
elif numbers[m] > numbers[j]:
i = m + 1
# numbers[m] 等于 numbers[j]则不能得出m在哪个数组中,但是可以得到j = j -1不会影响最后的结果
elif numbers[m] == numbers[j]:
j = j - 1
return numbers[j]