这道题面试一定不能用遍历和sort,面试官的本意是考察二分,要二分出旋转的点,那个点即是最小值,同时要有完全单调的特判。
class Solution {
public:
int findMin(vector<int>& nums) {
if (nums.empty()) return -1;
int n = nums.size() - 1;
while (n > 0 && nums[0] == nums[n]) n -- ; //去除末尾重复元素
if (nums[0] <= nums[n]) 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[l]; //数组不是完全单调,则分界点是最小元素
}
};