描述
有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围: 1≤n≤100001≤n≤100001≤n≤10000,数组中任意元素的值: 0≤val≤100000≤val≤100000≤val≤10000
要求:空间复杂度:O(1)O(1)O(1) ,时间复杂度:O(logn)O(logn)O(logn)
示例1
输入:[3,4,5,1,2]
返回值:1
示例2
输入:[3,100,200,3]
返回值:3
方法:
问题性质:旋转数组由两个递增子数组组成(如 [3,4,5,1,2])。最小值位于第二个子数组的首位(旋转点)。
二分查找:通过比较中间元素与右边界元素,逐步缩小搜索范围。
重复元素处理:当中间值等于右边界值时,通过 right–跳过重复项,避免错误分区。
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param nums int整型vector * @return int整型*/int minNumberInRotateArray(vector<int>& nums) {// write code hereint left = 0;int right = nums.size() - 1;while(left < right){int mid = (left + right) / 2;if(nums.at(mid) > nums.at(right)){left = mid + 1;}else if(nums.at(mid) < nums.at(right)){right = mid;}else{right--;}}return nums.at(left);}
};