利用二分查找法
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
Java代码实现:
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) / 2;
if(array[left] == array[mid] && array[mid] == array[right]){ //若左边、中间、右边三者相等,则比较mid前后之中较小的数
if(array[left+1] != array[right-1]){
mid = array[left+1] < array[right-1] ? left+1 : right-1;
}else{
left++;
right--;
}
}
else{
if(array[left] <= array[mid]){ //中间值大于左边界,将中间索引赋值给左边界
left = mid;
}else{
right = mid;
}
}
}
return array[mid]; //返回最小值
}
}