如果nums[mid + 1]大于num[mid],则一定能在大于等于nums[mid + 1]的区域找到一个峰值,为什么?因为如果nums[mid + 1] > num[mid],则nums[mid + 2]要么大于nums[mid + 1],要么小于nums[mid + 1]。如果小于,则nums[mid + 1]就是峰值,如果大于就继续往后找。有人要问一直大于怎么办,也就是呈递增趋势,别忘了题目要求nums[-1] = nums[n] = -∞
,如果一直递增,则nums[n - 1]一定是峰值。
相反如果nums[mid + 1] < num[mid],则一定能在小于等于nums[mid]的区域找到峰值。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right)
{
int mid = left + (right - left) / 2;
if (nums[mid + 1] > nums[mid])
left = mid + 1;
else
right = mid;
}
return left;
}
};