[剑指offer] 旋转数组的最小数字
题目
https://www.acwing.com/problem/content/description/20/
思路
因为数组可能包含重复项。所以有可能是下面这种排序方式:
这样子是不能用二分模板的,需要先处理成下面这个样子:
这时,左半边所有元素>=nums[0],右半边所有元素<nums[0],可以用模板。我们找到右半边第一个比第一个元素小的元素,即为满足题意的最小值。
Java代码
class Solution {
public int findMin(int[] nums) {
int n = nums.length;
if(n == 0) return -1;
n--;
while(n>0 && nums[n] == nums[0]) n--; //找到右边第一个比nums[0]小的位置 注意n>0
if(nums[n] >= nums[0]) return nums[0]; //有可能右半边处理之后不存在了,需要特殊判断一下
//二分
int l=0, r=n;
while(l<r){
int mid = l+(r-l)/2;
if(nums[mid] < nums[0]) r = mid;
else l = mid+1;
}
return nums[l];
}
}