题解 | #寻找峰值#
寻找峰值
https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @return int整型 */ int findPeakElement(vector<int>& nums) { // write code here int i = 0; int j = nums.size()-1; while (i < j) { int mid = (i + j ) / 2; // 中间低 右边高。-》 所以一定在右边有峰值 if (nums[mid] < nums[mid + 1]) { i = mid +1; } // 中间高 右边低 -》峰值可能出现在左边 当然 自身可能也是峰值 else if(nums[mid] > nums[mid + 1]){ //这里不用-1是因为自己可能就是山峰 j = mid ; } } return (i+j) /2; } };
就是题解的观点
目的是找到峰值,什么是峰值,就是i==j的时候,
因为mid < mid+1 的时候 mid的点一定不是峰值,峰值在右边 i = mid +1;
反之 mid > mid +1 的时候 ,mid点可能是峰值,但峰值可能也在更左。 j = mid ;
所以就会不断找,直到发现 i和j重合了,那么此时满足 mid-1<mid. && mid > mid +1