分析: 旋转数组就是将一组有序的数组分成了两部分有序的数组,在原始数组中,第一个元素就是最小的元素,旋转后两部分交界无序的点就是最少值了,因为两部分数组还是有序的,所以可以考虑用二分查找来做。 具体做法:
- 创建两个指针left和right,分别指向数组的首尾
- 如果区间中点值小于right值,说明最小值在左边,令right=mid
- 如果区间中点值大于right值,说明最小值在右边,令left=mid+1
- 如果区间中点值等于right值,那么就有点难以判断了,这个时候只能逐一减少right值,缩减右界
实现:
import java.util.*;
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int left=0;
int right=array.length-1;
int mid;
while(left<right){
mid=(left+right)>>>1;
if(array[mid]<array[right]){
//如果中间值大于右边值,说明最小值在左边的区间
right=mid;
}else if(array[mid]==array[right]){
//如果中间值等于右边值,这种情况不好判断,只能逐一缩减右界
right--;
}else{
//如果中间值小于右边值,说明最小值在右边的区间
left=mid+1;
}
}
return array[left];
}
}