题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路分析
遍历整个数组,即可找到最小数字,但是没有用到旋转,则该方法不行;但是我们可以用二分查找的思想,做一下。
代码实现
public Integer fingminNum(int[] a){
if (a == null){
return null;
}
int leftnum = 0;
int rightnum = a.length - 1;
int mid = 0;
while (a[leftnum] >= a[rightnum]){
if (rightnum - leftnum == 1){
mid = rightnum;
break;
}
mid = (leftnum + rightnum)/2;
if(a[leftnum] == a[rightnum] && a[leftnum] == a[mid]){
if (a[leftnum + 1] != a[rightnum - 1]){
mid = a[rightnum - 1] < a[leftnum + 1] ? rightnum - 1: leftnum + 1;
break;
}else
leftnum++;
rightnum--;
}else{
if (a[leftnum] >= a[mid]){
leftnum = mid;
}else {
if (a[rightnum] <= a[mid])
leftnum = mid;
}
}
}
return a[mid];
}