题目来源:链接
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。
实现代码:
def minArray(self, numbers: List[int]) -> int:
i,j = 0,len(numbers)-1
while i < j:
m = (i+j)//2
if numbers[m] > numbers[j]:
i = m+1
elif numbers[m] < numbers[j]:
j = m
else:
j -= 1
return numbers[i]
解题思路:
一看到排序数组,我们应该就要想到二分查找了,这里也是,而且这里的旋转点就是最小值的点
- 找到排序数组的中间位置,如果中间位置的值比最右端的数据要大,则说明旋转点在中间位置的右边,这里面有一系列证明正确性的知识,大家可以自行了解,也可以举例子在验证
- 如果中间位置的值比最右边的值要小,则说明旋转点在中间位置的左边
- 最后一种就是中间位置的值与最右端的值相等,这个时候两种情况都有可能,自行举例子,所以只需要缩小搜索范围即可