解题思路:
由题可得,旋转后的数组可分为两组,分别都是有序的。旋转后的数组的最右边的元素,肯定是右边组的最大的数,与中间数比较。
1.mid < right(右边最大),则最小值在左半边
right = mid, 有可能mid本身就是最小值
2.mid > right,则最小值在右半边
left = mid + 1,mid本身不可能是最小值
3.mid == right,说明数组出现了相同的数,只能right--,强行缩小数组的范围,
然后接下来再进行缩小二分查找了
当right与left mid重合到一个元素时,跳出while,则找到了最小值
代码如下:
/**
* 二分法
*/
class Solution {
public int minArray(int[] numbers) {
int left = 0, right = numbers.length - 1;
while(left < right) {
int mid = left + ((right - left) >> 1);
if(numbers[mid] < numbers[right]) {
right = mid;
} else if (numbers[mid] > numbers[right]) {
left = mid + 1;
} else {
right --;
}
}
return numbers[left];
}
public static void main(String[] args) {
Solution k = new Solution();
int[] a = new int[] { 3, 4, 5, 1, 2 };
System.out.println(k.minArray(a));
}
}