题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
分析:因为本题数组是已经排好序,所以想到折半排序法。降低算法复杂度。
1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4
以题目中例子为例分析,总共有五种情况,首先看最低位和中间位有没有规律。当最低位小于最高位时,是前三种,最小值的位置没有规律。
再看中间位和最高位,中间位<最高位 时,最小数在最低位和中间位之间。中间位>最高位时,最小数在中间位和最高位之间。
public class Solution { public int minNumberInRotateArray(int [] array) { int low=0; int high=array.length-1; if(array.length==0) return 0; while (low<high){ int mid=(low+high)/2; if(array[mid]<array[high]){ high=mid; }else { low=mid+1; } } return array[high]; } }