旋转数组的最小数字(改造二分法)

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

}

结果:

  旋转数组的最小数字(改造二分法)