旋转数组的最小数字_牛客题霸_牛客网 (nowcoder.com)
描述:
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤n≤10000,数组中任意元素的值: 0≤val≤10000
要求:空间复杂度:𝑂(1) ,时间复杂度:𝑂(𝑙𝑜𝑔𝑛)
示例1
输入:[3,4,5,1,2]
返回值:1
示例2
输入:[3,100,200,3]
返回值:3
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型一维数组 * @return int整型*/public int minNumberInRotateArray (int[] nums) {// write code hereint x=0;int l=0,r=nums.length-1;while(l<r){int mid=l+r>>1;x=(mid+1)%nums.length;if(nums[mid]<nums[r]) r=mid;else if(nums[mid]>nums[r])l=mid+1;else r--;}return nums[r];}
}
思路:
二分,关键:区间变化
- 若是区间中点值大于区间右界值,则最小的数字一定在中点右边。
- 若是区间中点值等于区间右界值,不能判断在哪个区间,比如[1,1,1,0,1],应该逐个缩减右界。
- 若是区间中点值小于区间右界值,则最小的数字一定在中点左边。