AcWing 22. 旋转数组的最小数字
原题链接
中等
作者:
Baymax0211
,
2019-04-06 14:48:38
,
所有人可见
,
阅读 1048
算法1
(遍历找到第一个比前一个小的数) $O(n)$
C++ 代码
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size() == 0) return -1;
for(int i = 0; i < nums.size() -1; i ++){
if(nums[i] >nums[i+1])
return nums[i+1];
}
return nums[0];
}
};
算法2
(二分查找) $O(logn)$
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; // [l, mid], [mid + 1, r]
if (nums[mid] < nums[0]) r = mid;
else l = mid + 1;
}
return nums[r];
}
};