题解 | #旋转数组的最小数字#
旋转数组的最小数字
https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int minNumberInRotateArray(vector<int>& nums) {
// write code here
// 将旋转之后位于右边的数组称为右边数组,左边数组称为左边数组。右边数组的第一个元素即为最小值。如果将0个元素进行旋转,则整个数组均为右边数组部分。
int l = 0;
int r = nums.size()-1;
//待查区间[l, r].
int n = nums.size();
while(l <= r){
int mid = l + (r-l)/2;
if(nums[mid] < nums[r])
{
//最小值元素一定位于mid或者mid左边
r = mid;
}
else if (nums[mid] > nums[r]) {
//最小值元素一定位于mid右边
l = mid + 1; // l-1位置一定位于最小值左边
}
else{
r = r - 1; //最小值元素位置不确定。可以确定的是去掉nums[r]不会错过最小值元素。因为nums[mid] == nums[r]. 如果nums[r]是最小值元素,则nums[mid]仍然在搜索区间内。如果r = mid, 则r + 1即为最终元素。
}
// 最后l = r + 1.
}
return nums[r+1];
}
};

查看11道真题和解析