162. Find Peak Element (Solution || Leetcode medium || Java)

Palakkgoyal
2 min readOct 30, 2022

--

A peak element is an element that is strictly greater than its neighbors.

Given a 0-indexed 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] = nums[n] = -∞. In other words, an element is always considered to be strictly greater than a neighbor that is outside the array.

You must write an algorithm that runs in O(log n) time.

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: 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.

Constraints:

  • 1 <= nums.length <= 1000
  • -231 <= nums[i] <= 231 - 1
  • nums[i] != nums[i + 1] for all valid i.

SOLUTION 1:

class Solution {
public int findPeakElement(int[] nums) {
if(nums.length < 2 || nums[0] > nums[1]){
return 0;
}
if(nums[nums.length — 1] > nums[nums.length — 2]){
return nums.length — 1;
}

int start = 1;
int end = nums.length — 2;

while(start <= end){
if(nums[start] > nums[start + 1]){
return start;
}else{
start += 1;
}

if(nums[end] > nums[end — 1]){
return end;
}else{
end -= 1;
}
}
return -1;
}
}

NOTE:

I saw a solution on web and according to me that solution is not exact but leetcode is saying

Runtime: 0 ms, faster than 100.00% of Java online submissions for Find Peak Element.

Memory Usage: 42.5 MB, less than 70.96% of Java online submissions for Find Peak Element.

As it is given in the question that “A peak element is an element that is strictly greater than its neighbors”, it means not equal but the element must be greater. So, this solution fails in my input that is : [1,2,1,3,5,5,5]

The solution:

class Solution {
public int findPeakElement(int[] nums) {
int i = 0, j = nums.length — 1;
while (i < j) {
int m = i + (j — i) / 2;
if (nums[m] > nums[m + 1]) j = m;
else i = m + 1;
}
return i;
}
}

[If I am wrong then please, please, please correct me]

Thank you for reading. If you have any queries, please let me know in the comment section, I will surely response toward it.

--

--

Palakkgoyal
Palakkgoyal

Written by Palakkgoyal

Solutions to all your coding related problems at one point. DSA question on daily basis and much more.

No responses yet