题目:
> 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
> 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
> NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
方法一:遍历数组
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length==0||array==null)
return 0;
int number = array[0];
for(int i =1;i<array.length;i++){
if(array[i]<number){
number = array[i];
}
}
return number;
}
}
方法二:二分查找
> import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
//排除数组为 0 的情况
if(array.length==0||array==null)
return 0;
//定义左右边界
int left = 0;
int mid = 0;
int right = array.length - 1;
//如果left所对应的值大于等于right对应的值,并且left与right相邻,说明最小值在后半部分
while(array[left]>=array[right]){
if(right-left==1){
mid = right;
break;
}
mid = left + ((right-left)>>1);
//如果数组中有多个数值相等
if(array[left]==array[right] && array[left]==array[mid]){
int result = array[left];
for(int i = left+1;i<right;i++){
if(array[i]<result){
result = array[i];
}
}
return result;
}
//左边界的值小于中间,说明最小值在后半部分,更新mid
if(array[mid]>=array[left]){
left = mid;
}
else{
right = mid;
}
}
return array[mid];
}
}
ps:如有不足,感谢指导!