旋转数组的最小数字(改造二分法)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{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]; } }
结果: