本题基本思路是通过二分查找缩小范围,start指针一直在前面的递增数组中向前移动,end指针一直在后面的递增数组中向后移动,最后两者相差1的时候,就是end指针指向最小值的时候。
但要考虑两种特殊情况:
1、数组旋转0个,即此时已经是有序数组,应该直接返回第一个数,因此,mid初始化为0;
2、start\min\end指针都指向相同的数字,那么我们就没有办法知道往哪个方向移动,此时只能遍历使用O(n)复杂度的算法。
以下为具体程序
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if (array == null || array.length == 0) {
return 0;
}
int start = 0;
int end = array.length - 1;
int mid = 0;
while (array[start] >= array[end]) { // 判断是否为有序数组,即旋转0个
if (end - start == 1) { // end指向了最小的一个
mid = end;
break;
}
mid = (start + end) / 2;
if (array[start] == array[end] && array[mid] == array[start]
&& array[mid] == array[end]) {
return orderNSolution(array, start, end);
}
if (array[mid] >= array[start]) {
start = mid;
} else {
end = mid;
}
}
return array[mid];
}
private int orderNSolution(int[] array, int start, int end) {
int min = array[start];
for (int i = start + 1; i <= end; i++) {
if (min > array[i]) {
min = array[i];
}
}
return min;
}
}