题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。
例子:
解法1:(二分递归法)
public class Solute {
private int min;
public int minArray(int[] numbers ){
if (numbers.length==1){
return numbers[0];
}
fun(numbers, 0, numbers.length-1);
return min;
}
public static void main(String[] args) {
int i = new Solute().minArray(new int[]{2,2,2,0,1});
System.out.println(i);
}
private void fun(int[] numbers, int i, int j){
if (i == j){
min = numbers[j];
return;
}
int m = (i + j) / 2;
if (numbers[m] < numbers[j]){
fun(numbers, i, m);
}else if (numbers[m] > numbers[j]){
fun(numbers, m+1, j);
}else if (numbers[m] == numbers[j]){
fun(numbers, i, j-1);
}
}
}
解法1解析:
为什么可以用二分法定位呢?
因为是旋转的,所以必定有大排序数组b在小排序数组a的左边。如图:
所以只需要比较中间点与最右边点的值就可。