题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
示例1
输入
[3,4,5,1,2]
返回值
1
题目大意个人理解: 非递减数组就是递增或相等
如:
1,2,3,4,5,6,7.
1,2,3,6,7,8,10.
1,1,1,3,3,3,4,5.
把上面数组旋转,假如都在下标为2的地方旋转,即把前3个截取放到数组后面,这就是非递减数组旋转后的一个数组
4,5,6,7,1,2,3.
6,7,8,10,1,2,3.
3,3,3,4,5,1,1,1.
public int minNumberInRotateArray(int [] array) {
if (array.length == 0) return 0;
int first = 0, last = array.length - 1;//第一个下标和最后一个下标
while (first < last) {
if (array[first] < array[last]) {//找到数组突然减少的断层点就是最小,提前退出
return array[first];
}
int mid = (first + last) / 2;
if (array[mid] > array[last]) {//中间数大于最后一个,说明断层的最小在mid右边
first = mid + 1;
} else if (array[mid] < array[last]) {//小于,说明断层最小数是mid或mid左边
last = mid;
} else {//等于,不能确定在哪边,只能last--,慢慢缩短区间。如,2 2 2 1 2
last--;
}
}
return array[first];
}