寻找旋转数组的最小数字
(牛客网—牛客题霸算法篇—NC71)
题目描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],[0,0,1,1,2,3]等,将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。
给定这样一个旋转数组,求数组中的最小值。
思路
二分查找
可以直接遍历数组 ,寻找最下的值,但这样就浪费了题目中给出的“旋转数组”的条件
因此我们可以选用二分法来查找。
定义left、right分别指向数组的两端,min=(left+right)/2(向下取整)
当min所指向的值小于right所指向的值时,说明最小值在[left,min]之间,令right=min
当min所指向的值大于right所指向的值时,说明最小值在[min,right]之间,令left=min
当min所指向的值等于right所指向的值时,不能确定min在哪个区间,将right-1
循环结束条件为left!<right或者left+1==right
代码实现
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0)
return 0;
int left=0;
int right=array.length-1;
int min=0;
while(left<right&&left+1!=right){
min=(left+right)/2;
if(array[min]<array[right]){
right=min;
}else if(array[min]>array[right]){
left=min;
}else{
right=right-1;
}
}
if(left+1==right){
return array[left]<array[right]?array[left]:array[right];
}
return array[left];
}
}