试题:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
代码:
因为是有序的优先想到二分法,以前二分法都是通过mid的value等于查找值作为查找到条件。此处因为排序打乱了,使用array[mid]<array[mid-1]
作为判断条件。代码存在一个问题就是,如果数组为1 0 1 1 1,会出现查找不到情况。也就是此时会出现没办法判断mid应该处于最小值的左边或右边的问题。但牛客上直接运行通过。
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length == 0) return 0; //array为空直接返回情况
int left = 0;
int right = array.length-1;
int mid;
while(left <= right){
mid = (left+right)/2;
if(array[mid]<array[mid-1]){ //找到mid值比左边值要小,返回情况
return array[mid];
}else if(array[mid]>=array[0]){
left = mid+1;
}else{
right = mid-1;
}
}
return array[0]; //array全为相同值返回情况
}
}