解题思路:这是二分查找的变体,首先数组原来是有序的,所以第一步应该想到二分查找,只是在讨论边界的时候有一些区别,分三种情况:
(1)中间元素array[mid]大于最右边的元素,例如[3,4,5,1,2],这说明mid左边是连续变大的,因此最小的数字只能在mid的右边(不包括mid);
(2)array[mid]小于最右边元素,例如[4,5,1,2,3],说明mid往后的元素是递增的,因此最小元素应该在mid的左边(包括mid);(3)array[mid]等于最右边元素,则将最右边元素往前移动,知道不相等,再进行上面两种情况的判断。
时间复杂度为O(logn),空间复杂度为O(1)。
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array==null || array.length==0)
return 0;
int low=0,high=array.length-1;
while(low<high){
int mid = (low+high)/2;
if(array[mid]>array[high])
low = mid+1;
else if(array[mid]<array[high])
high = mid;
else
high--;
}
return array[low];
}
}