题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:用二分查找算法,再用三个指针,一个是low指针指向前段的第一个元素,一个是high指针指向后段的最后一个元素,另一个是指针指向中间元素。
代码:
package offer;
public class TestNo6 {
public static void main(String[] args) {
int[] a = {3,4,5,1,2};
int[] b = {2,2,2,2,2};
//System.out.println(new TestNo6().minNumberInRotateArray(b));
System.out.println(new TestNo6().minNumberInRotateArray(a));
}
public int minNumberInRotateArray(int [] array) {
if(array.length == 0){
return 0;
}
int low = 0;
int high = array.length-1;
int mid = low;
while (array[low] >= array[high]){
//左边的值比右边的值大并且这两个值下标差距为1的时候,右边的值就是最小值
if(high - low == 1){
mid = high;
break;
}
mid = (low+high)/2;
//当中间值比左边值大的时候,说明最小值还在后面
if(array[mid] >= array[low]){
low = mid;
}
//当中间值比左边值小的时候,说明最小值在前面
else if(array[mid] <= array[high]){
high = mid;
}
}
return array[mid];
}
}