Description
A peak element is an element that is greater than its neighbors.
Given an input array nums, where nums[i] ≠ nums[i+1], find a peak element and return its index.
The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.
You may imagine that nums[-1] = nums[n] = -∞.
Example 1:
Input: nums = [1,2,3,1] Output: 2 Explanation: 3 is a peak element and your function should return the index number 2.
Example 2:
Input: nums = [1,2,1,3,5,6,4] Output: 1 or 5 Explanation: Your function can return either index number 1 where the peak element is 2, or index number 5 where the peak element is 6.
Note: Your solution should be in logarithmic complexity.
Solution
Use binary search, the data can be considered partial sorted. There could be a couple of peaks. And also we need find the lower bound of the peak. so we use the lower bound binary search template in this summary.
Code
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0;
int right = nums.size() -1;
while(left < right){ /*❶*/
int mid = left + (right - left)/2;
if(nums[mid] >= nums[mid+1]){ /*❷*/
right = mid; /*❷*/
}else {
left = mid+1;
}
}
return left;
}
};
❶, ❷: all are key attributes of lower bound binary search template.
Insight
This question is the second kind of question in the summary, data is somehow partially sorted, but we can still leverage it by using binary search.
Leetcode852 Peak Index in a Mountain Array is exactly same question using exactly same code.