力扣162. 寻找峰值(二分查找变式)

1.峰值到来前一定呈增长的趋势,所以只要存在a[i+1]>a[i],说明i的正方向上一定有一个峰值;若存在a[i-1]>a[i],说明i的负方向上一定有一个峰值

2.题目给出左右的边界都是-∞,所以对于边界元素(a[0],a[nums.size()-1])只要比相邻元素大,那就是峰值。

3.使用二分的思路,一直往呈增长趋势的方向上遍历

 1 class Solution {
 2 public:
 3     vector<int> nums;
 4     int binaryFind(int left, int right) {
 5         int mid = (left + right) / 2;
 6         if (mid + 1 <= right && nums[mid + 1] > nums[mid]) { //正方向呈增长趋势
 7             return binaryFind(mid + 1, right);
 8         }
 9         if (mid - 1 >= 0 && nums[mid - 1] > nums[mid]) { //负方向呈增长趋势
10             return binaryFind(left, mid - 1);
11         }
12         return mid; //此处包含了left=right与边界元素的情况
13     }
14     int findPeakElement(vector<int>& nums) {
15         this -> nums = nums;
16         return binaryFind(0, nums.size() - 1);
17     }
18 };

 

posted on 2025-02-27 20:27  Coder何  阅读(32)  评论(0)    收藏  举报