题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
/*
* 思路:
* {3,4,5,1,2}
* 1. 对于一个递增序列的旋转,前半部分和后半部分都还是递增,只有最小值的那个位置的数小于它前面的数,这个位置递减。
* 所以问题转化为找到数组中的比前一个数小的数;可以直接遍历,也可以简化为二分查找:找到一个比它前一个数小的数;
*
* 2.还有一个特点:前半部分的数都比数组的最后一个数大,后半部分的数都比最后一个数小;要找的数为后半部分第一个
* 这一点用于缩小二分查找的范围
*/
public int minNumberInRotateArray(int[] array) {
//数组大小为0返回0
if (array.length == 0) {
return 0;
}
int left = 0;
int right = array.length - 1;
int end = array[array.length - 1];
while (left < right) {
// 剩余两个数;left始终处于左半部分,则剩余的right为右半部分的第一个,返回array[right]
if ((right - left) == 1)
{
return array[right];
}
int mid = (right + left) / 2;
//找到一个数比前一个数小,返回这个数
if (array[mid] < array[mid - 1]) {
return array[mid];
}
else if (array[mid] > end) //这个数比最后一个数大,则处在左半部分,left更新为mid
{
left = mid;
} else if (array[mid] < end) { //这个数比最后一个数小,处于右半部分,但不满足比前一个数小,right更新为mid
right = mid;
}
}
return -1;
}