题解 | 寻找峰值 这里的二分很有意思 找mid邻近比mid大的元素
寻找峰值
https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int findPeakElement(vector<int>& nums) {
// write code here
//只想到用两个条件去限制 遍历整个数组 为o(n)
//不是白给的这个边界为最小值的条件 这说明一定有峰 一直往高处走找到那个最高的就行了
//这个逻辑没有问题,因为各个元素都不相等,所以这个元素要么比他旁边的大要么比他旁边的小,找到这个相对最大的元素,尽管他的位置可能是在两侧,但是因为右侧数值为负无穷,所以它也是峰值
//看到logn想到二分查找
int left=0,right=nums.size()-1;
int mid=0;
while(right>=left){
mid=(left+right)/2;
/*
if(nums[left]>nums[mid])right=mid-1;
else if(nums[right]>nums[mid])left=mid+1;
else
这个逻辑有问题 应该找的是相对mid的那一片区域
*/
if(nums[mid+1]>nums[mid])left=mid+1;
else if(nums[mid-1]>nums[mid])right=mid-1;
else return mid;
}
return mid;
}
};
