一.网页直达
https://leetcode.cn/problems/find-peak-element
二.题目解析

解析:
题目上给出的时间复杂度就暗示我们需要使用二分算法,我们发现相邻位置没有相同的数字.
我们先来想暴力解法:遍历数组,利用单调性的变化来判断是否是峰值,或者是单调不变的那峰值就是第一个数或者是最后一个数.(一共三种情况),时间复杂度就是O(N)
我们抽象出一个模型出来,找到二段性,使用二分查找.

情况一就是arr[mid]>arr[mid+1],说明结果一定在二段性的左边.while更新右边区间right=mid,继续寻找峰值.

情况二:就是arr[mid]<arr[mid+1],说明结果一定在二段性的右边.while更新左边区间left=mid+1,继续寻找峰值.
代码实现:
cpp
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]>nums[mid+1])right=mid;
else left=mid+1;
}
return left;
}
};
二分法不是只在单调区间里面的,只需要找到二段性,就可以使用.