把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
几个Corner case:
1.如果数组实际没有反转是完全有序的
2.如果找到的mid 和start、end相等怎么判断,323333333 333333323 这两种情况
先用二分法来找,因为可以非降序可能出现相等的情况,所以比较的时候要有等号
1.mid>=start 说明mid是在前半个增序列 start=mid
2.mid<start 则在后一个序列 end=mid
二分操作 start始终在前半个序列 end在后半个序列
操作到最后start是前序列的最后一个 end是后序列的第一个 返回end即可
corner case的处理:
1.如果完全有序 把mid初始化成start 直接返回
2.遍历
public class Solution {
public int findMin(int[] array) {
if(array.length==0) return 0;
int start=0;
int mid=start;
int end=array.length-1;
while(array[start]>=array[end]){
if(end-start==1) return array[end];
mid=start+(end-start)/2;
if(array[start]==array[end]&&array[end]==array[mid])
return find(array,start,end);
if(array[mid]>=array[start])
start=mid;
else if(array[mid]<=array[end])
end=mid;
}
return array[mid];
}
public int find(int[]array,int start,int end){
int min=array[start];
for(int i=start;i<end;i++){
if(array[i]<min)
min=array[i];
}
return min;
}
}
用这种方法超时
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0) return 0;
int start=0;
int end=array.length-1;
while(start<end){
int mid=start+(end-start)/2;
if(array[mid]>array[start])
start=mid;
else if(array[mid]<array[start])
end=mid;
else {
if(array[mid]>array[end])
start=mid;
else if(array[mid]<=array[end])
end=mid;
}
}
return array[start];
}
}