文章目录
旋转数组的最小数字
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤n≤100001 \le n \le 100001≤n≤10000,数组中任意元素的值: 0≤val≤100000 \le val \le 100000≤val≤10000
要求:空间复杂度:O(1)O(1)O(1) ,时间复杂度:O(logn)O(logn)O(logn)
实例:
输入:[3,4,5,1,2]
返回值:1
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array == null || array.length == 0){ //合法性判断
return 0;
}
int left = 0;
int right = array.length-1;
int mid = 0; //二分查找
while(array[left] >= array[right] ){ //循环条件:非递减
if(right - left == 1){ //有两个值且相等
mid = right;
break;
}
mid = (left+right) >> 1; //中间值计算
if(array[left] == array[right] && array[mid] == array[left]){ //三个值且相等
int result = array[left]; //遍历数组
for(int i = left+1;i < right;i++){ //left和right的值是相等的
if(result > array[i]){
result = array[i];
}
}
return result;
}
//旋转分为两部分,两部分都是非递减的,并且前部分的数>后部分的数
if(array[mid] >= array[left]){ //mid在前半部分,寻找的最小值在mid右边
left = mid; //二分查找排除左边
}
else{ //mid在后半部分,寻找的值在mid左边
right = mid; //二分查找排除右边
}
}
return array[mid];
}
}