思路:
方案一:直接遍历数组,找到最小的。不足以面试哦。
方案二:利用二分查找。当数组旋转之后比如{3,4,5,1,2},前半部分为递增数组,后半部分为递减数组。所以可以定义两个指针
left和right。中间值mid=(left+right)/2;
当array[left]>=rray[right]时,说明旋转数组在[left,right]区间内;
- 当left=right-1时,右边的数字则为最小的数字。
- 当array[mid]>=array[left]说明左边为递增序列,将mid赋给left;否则将mid赋给right;
- 当数组中的元素可以重复时,重复部分的数字就只能顺序遍历。比如{1,0,1,1,1}
public int minNumberInRotateArray(int [] array) {
if(array.length==0||array==null){
return 0;
}
int left=0;
int right=array.length-1;
int mid=left;
while(array[left]>=array[right]){
if(right-left==1){
return array[right];
}
mid=(left+right)/2;
if(array[left]==array[mid]&&array[mid]==array[right]){
return minNumber(array,left,right);
}
if(array[mid]>=array[left]){
left=mid;
}else{
right=mid;
}
}
return array[mid];
}
public static int minNumber(int [] array,int left,int right){
int temp=array[left];
for(int i=left+1;i<right;i++){
if(temp>array[i]){
temp=array[i];
}
}
return temp;
}
1234

被折叠的 条评论
为什么被折叠?



