Leetcode 162. Find Peak Element
A peak element is an element that is strictly greater than its neighbors. Given an integer array nums
, find a peak element, and return its index. If the array contains multiple peaks, return the index to any of the peaks.
You may imagine that nums[-1] = -∞
and nums[n] = -∞
(where n
is the length of the array).
You must write an algorithm that runs in O(log n)
time.
Input: nums = [1,2,3,1]
Output: 2
Explanation: 3 is a peak element and your function should return the index number 2.
Input: nums = [1,2,1,3,5,6,4]
Output: 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.
1 <= nums.length <= 1000
-2^31 <= nums[i] <= 2^31 - 1
nums[i] != nums[i + 1]
for all valid i
.-∞
?
-∞
.Given the requirement to achieve O(log n)
time complexity, we can utilize a binary search approach. The idea is to:
The process repeats until a peak is found.
#include <vector>
#include <iostream>
int findPeakElement(std::vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
while (left < right) {
int mid = left + (int)((right - left) / 2); // to avoid potential overflow
if (nums[mid] > nums[mid + 1]) {
// Mid might be a peak, so search in [left, mid]
right = mid;
} else {
// Peak must be in [mid + 1, right]
left = mid + 1;
}
}
// `left` should be pointing to the peak element at the end of the loop
return left;
}
int main() {
std::vector<int> nums = {1, 2, 3, 1};
std::cout << "Index of a peak element: " << findPeakElement(nums) << std::endl;
std::vector<int> nums2 = {1, 2, 1, 3, 5, 6, 4};
std::cout << "Index of a peak element: " << findPeakElement(nums2) << std::endl;
return 0;
}
The time complexity of this algorithm is O(log n)
because each step of the binary search reduces the search space by half. This is efficient for large arrays and meets the problem requirements.
Got blindsided by a question you didn’t expect?
Spend too much time studying?
Or simply don’t have the time to go over all 3000 questions?