题目概述
把一个数组最开始的若干个元素搬到数组的末尾,
我们称之为数组的旋转。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,
该数组的最小值为1。
分析:(图来自力扣)
旋转之后数值的分布如图
用二分查找来实现
比较high与pivot
若high大于piovt,则看图piovt只可能出现在最小值右半部分,二分查找的范围必须是包含所要找的目标的,所以high值变为pivot
若high小于piovt,则看图piovt只可能出现在最小值左半部分,二分查找的范围必须是包含所要找的目标的,所以low值变为pivot+1
相等的情况则high减一,不用担心忽略了最小元素,因为还有pivot
代码展示:
class Solution {
public int minArray(int[] numbers) {
//暴力破解可以解决,但是当数据量大的时候二分查找才是最佳的 //二分查找的第一步 定义两个“指针”第一个指向头结点,第二个指向尾结点
int low=0;
int high=numbers.length-1;
while(low<high){
//每次都要计算pivot也就是那个二分点
int pivot=low+(high-low)/2
if(numbers[pivot]<numbers[high])
{
high=pivot;
}else if(numbers[pivot]>numbers[high])
{
low=pivot+1;
}else
{
high--;
}
}
return numbers[low];
}
}