AcWing 22. 旋转数组的最小数字
原题链接
中等
作者:
ziwei
,
2021-04-04 02:47:18
,
所有人可见
,
阅读 337
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个升序的数组的一个旋转,输出旋转数组的最小元素。例如数组 {3,4,5,1,2} 为 {1,2,3,4,5} 的一个旋转,该数组的最小值为 1。数组可能包含重复项。注意:数组内所含元素非负,若数组大小为 0,请返回 −1。
样例
输入:nums=[2,2,2,0,1]
输出:0
算法–二分
根据单调性 数组的大小的分布,类似于一个先递增再递减的函数,其内部总有一个点其左右两侧大小有变化
时间复杂度 log(N) 最差情况为O(n)
C++ 代码
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size() - 1;
if (n < 0) return -1;
while (n > 0 && nums[n] == nums[0]) n -- ;
if (nums[n] >= nums[0]) return nums[0];//处理特殊情况
int l = 0, r = n;
while (l < r) {
int mid = l + r >> 1; //二分法的精髓
if (nums[mid] < nums[0]) r = mid;//确定条件
else l = mid + 1;
}
return nums[r];//也可以写成return nums[l]
}
};