描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1 输入:[3,4,5,1,2] 返回值:1
归纳
一个非递减的数组,前几个数字被整体移到了结尾,求最小数字。
二分思路: 答案在left和right之间,mid = (left+right)/2,注意这个mid向下取整。 如果array[left]==array[mid]==array[right]无法判断只能遍历。 如果array[left]<=array[mid],左边有序,说明答案在右[mid+1,right]。 否则如果array[left]>array[mid],左边无序,答案在左[left+1,mid]。
代码
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int left = 0,right = array.length-1;
while(left<right){
if(array[left]<array[right])
return array[left];
int mid = (left + right)/2;
if(array[left] == array[right] && array[left] == array[mid]){
for(int i = left;i<right-1;i++){
if(array[i]!=array[i+1])
return array[i+1];
}
}
if(array[left]<=array[mid]){
left = mid+1;
}else{
right = mid;
}
}
return array[left];
}
}
总结
注意左中右可能相等的情况。
|