1、题目描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1 \le n \le 100001≤n≤10000,数组中任意元素的值: 0 \le val \le 100000≤val≤10000
要求:空间复杂度:O(1)O(1) ,时间复杂度:O(logn)O(logn)
2、算法分析
无非是这几种情况:
①[45123]:
这种情况下,123是有序的且,array[mid] < array[right],此时right = mid
②[34512]:
这种情况下,array[mid] > array[right],此时left = mid + 1
③[11101]
这种情况下,缩小范围,right--;
最后返回的是array[left],因为数组是有序。
3、代码实现
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array == null || array.length == 0){
return -1;
}
return binary(array,0,array.length - 1);
}
public int binary(int arr[],int left,int right){
while(left < right){
int mid = left + (right - left) / 2;
// [34512]
if(arr[mid] > arr[right]){
left = mid + 1;
// [45123]
}else if(arr[mid] < arr[right]){
right = mid;
}else{
//[1111011]
right--;
}
}
return arr[left];
}
}