AcWing 22. 旋转数组的最小数字
原题链接
中等
作者:
逆时针
,
2020-08-18 22:00:05
,
所有人可见
,
阅读 689
C++ 代码
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size();
if (n == 0)
return -1;
// 删除nums尾端和第一个数相同的值,使得分界点左边的数都>=nums[0],右边都<nums[0],以保证可以二分
while (n > 0 && nums[n-1] == nums[0])
--n;
// 找第一个true
// F F ... F [T] T... T
int l = 0, r = n - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (check(mid, nums))
r = mid;
else
l = mid + 1;
}
// 若全是false,即nums[x] >= nums[0], for all x,则nums[0]为最小数
// 否则,l为最小数所在的位置
if (!check(l, nums))
return nums[0];
else
return nums[l];
}
private:
bool check(int x, vector<int>& nums) {
return nums[x] < nums[0];
}
};