方法:使用二分法
为什么二分查找大的那一半一定会有峰值呢?(即query(mid) < query(mid + 1)时,mid+1~N一定存在峰值)
理解:首先已知query(mid) < query(mid+1),那么mid+2只有两种可能,一个是大于mid+1,一个是小于mid+1,小于mid+1的情况,那么mid+1就是峰值,大于mid+1的情况,继续向右推,如果一直到数组的末尾都是大于的,那么可以肯定最后一个元素是峰值,因为nums[-1] = nums[n] = -∞
// Forward declaration of queryAPI.
// int query(int x);
// return int means nums[x].
class Solution {
public:
int findPeakElement(int n) {
int l = 0, r = n - 1;
while(l < r)
{
int mid = l + r >> 1;
if(query(mid) < query(mid + 1))
{
l = mid + 1;
}
else
{
r = mid;
}
}
return l;
}
};