输入一个递增数组的 旋转数组(左侧若干个元素移到右边),输出该数组的最小值。
思路
由于是递增数列,故最小元素的左右两侧的元素均比其大;另外在二分法的指针思想中,前后两个指针不断向中间缩进,最后可以通过(end-start)==1
来作为递归的终止条件。
另外在寻找中间元素时,一直写的是int i=Math.round((end-start)/2-1);
,运行时候都会报出数组边界错误。应该改为int i=Math.round((end+start)/2);
,低级错误中包含的是数学功底扎实,直线思维。
解法
/**
* 面试题11:旋转数组的最下数字
* 输入一个递增数组的 旋转数组(左侧若干个元素移到右边),输出该数组的最小值
*
* 多多利用指针的思想
* @author Heroin X
* @date 2019/12/21 18:54
*/
public class MiniRotatedArray {
public static void main(String[] args) {
int[] arr={3,4,5,1,2};
int[] arr2={5,1,2,3,4};
int miniElement = getMiniElement(arr, 0, arr.length - 1);
int miniElement2 = getMiniElement(arr2, 0, arr.length - 1);
System.out.println(miniElement);
System.out.println(miniElement2);
}
static int getMiniElement(int[] arr,int start,int end){
if (start>=end){
return -1;
}
if ((end-start)==1){
return arr[end];
}
//易错点
// int i=Math.round((end-start)/2-1);
int i=Math.round((end+start)/2);
if (arr[i]>arr[start]){
//则说明最小元素在后半段
return getMiniElement(arr,i,end);
}else {
//则说明最小元素在前半段
return getMiniElement(arr,start,i);
}
}
}