二分法找旋转点,这个点所在的值即是最小值。
如果有重复数字的话,还需要多一个操作,删除末尾的重复数字:
while (n > 0 && nums[0] == nums[n]) n -- ;
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size();
int l = 0, r = nums.size();
if (nums[0] < nums[n - 1]) return nums[0]; //数组完全有序,则返回第一个元素
while (l < r)
{
int mid = (l + r) >> 1;
if (nums[mid] <= nums.back()) r = mid; //将中间值与数组末尾元素比较
else l = mid + 1;
}
return nums[l];
}
};