力扣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 };
浙公网安备 33010602011771号