10.旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个升序的数组的一个旋转,输出旋转数组的最小元素。
例如数组 {3,4,5,1,2}为 {1,2,3,4,5}的一个旋转,该数组的最小值为 1。
数组可能包含重复项。
注意:数组内所含元素非负,若数组大小为 0,请返回 −1。
数据范围:
数组长度 [0,90]。
样例:
输入:nums = [2, 2, 2, 0, 1]
输出:0
代码:
class Solution {
public int findMin(int[] nums) {
//获取数组最后以恶搞元素的索引
int n = nums.length - 1;
//处理空数组的情况
if(n<0)return -1;
//跳过数组末尾所有大于等于nums[0]的元素
//这样可以快速定位到旋转点之后的区域
while(n>0&&nums[n]>=nums[0])n--;
//如果所有元素都大于等于nums[0],说明数组未被旋转
if(nums[n]>=nums[0])return nums[0];
//初始化二分查找的左右边界
int l = 0, r = n;
//在可能包含最小值的区间内进行二分查找
while(l<r){
//计算中间点
int mid = l+r>>1;
//如果右端点大于等于中间值,说明最小值在左半部分
if(nums[r]>=nums[mid])r = mid;
//否则最小值在右半部分
else l = mid+1;
}
//最终l指向的就是最小值
return nums[l];
}
}

浙公网安备 33010602011771号