题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
思路:这儿题目说了数组是有序的,为了提升效率,可以用二分查找去做,题目上也说了用二分查找去做。事实上,以后的题目,只要说了有序,基本都可以用效率更高的查找,比如二分查找。
代码:
public class 旋转数组的最小数字 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arr = {5,1,2,3,4};
System.out.println("最小数字为"+min(arr));
}
/**
* 活用二分查找
* @param arr
* @return
*/
static int min(int arr[]){
int begin = 0;
int end = arr.length - 1;
// 考虑没有旋转这种特殊的旋转
if (arr[begin] < arr[end]) return arr[begin];
while(begin+1<end){
int mid = begin + ((end-begin)>>1);
// 要么左侧有序,要么右侧有序
// 下面这行代码有个bug 假如数组为 1 1 1 0 1 这种数组应该在程序的入口检测一下
// 假如左侧和中间相等了 那么就应该用顺序查找最小值了。
if (arr[mid] >= arr[begin]) { // 左侧有序
begin = mid;
}else {
end = mid;
}
}
return arr[end];
}
}
结果: