Bird
Raised Fist0
DSA Javascriptprogramming

Find Peak Element Using Binary Search in DSA Javascript

Choose your learning style10 modes available
Mental Model
A peak element is one that is bigger than its neighbors. We can find it quickly by checking the middle and deciding which side to search next.
Analogy: Imagine hiking on hills. If you stand somewhere and see the hill going up on one side, you walk that way to find the top. If it goes down, you walk the other way.
Index: 0   1   2   3   4   5   6
Value: 1 -> 3 -> 5 -> 4 -> 2 -> 6 -> 1
               ↑ mid pointer
Dry Run Walkthrough
Input: array: [1, 3, 5, 4, 2, 6, 1]
Goal: Find any peak element index where the element is greater than neighbors
Step 1: Calculate mid = (0 + 6) // 2 = 3; check element at index 3 (value 4)
Array: 1 -> 3 -> 5 -> [4↑mid] -> 2 -> 6 -> 1
Why: We start by checking the middle element to decide which half to search next
Step 2: Compare mid element 4 with next element 2; since 4 > 2, move search to left half
Search range: indices 0 to 3
Array: 1 -> 3 -> 5 -> [4↑mid]
Why: If mid is greater than next, peak must be on left side or at mid
Step 3: Calculate new mid = (0 + 3) // 2 = 1; check element at index 1 (value 3)
Array: 1 -> [3↑mid] -> 5 -> 4
Why: We narrow search to left half and check its middle
Step 4: Compare mid element 3 with next element 5; since 3 < 5, move search to right half
Search range: indices 2 to 3
Array: 5 -> [4]
Why: If mid is less than next, peak must be on right side
Step 5: Calculate new mid = (2 + 3) // 2 = 2; check element at index 2 (value 5)
Array: [5↑mid] -> 4
Why: Check middle of new range to find peak
Step 6: Compare mid element 5 with next element 4; since 5 > 4, peak found at index 2
Peak element: 5 at index 2
Why: Element 5 is greater than neighbors, so it is a peak
Result:
Peak element found at index 2 with value 5
Annotated Code
DSA Javascript
class Solution {
  findPeakElement(nums) {
    let left = 0;
    let right = nums.length - 1;
    while (left < right) {
      const mid = Math.floor((left + right) / 2);
      if (nums[mid] < nums[mid + 1]) {
        left = mid + 1; // move right because peak is there
      } else {
        right = mid; // move left including mid because peak is here or left
      }
    }
    return left; // left == right is peak index
  }
}

// Driver code
const solution = new Solution();
const nums = [1, 3, 5, 4, 2, 6, 1];
const peakIndex = solution.findPeakElement(nums);
console.log(`Peak element found at index ${peakIndex} with value ${nums[peakIndex]}`);
while (left < right) {
loop until search range narrows to one element
const mid = Math.floor((left + right) / 2);
find middle index of current search range
if (nums[mid] < nums[mid + 1]) {
compare mid element with next to decide search direction
left = mid + 1; // move right because peak is there
if next is bigger, peak must be on right side
right = mid; // move left including mid because peak is here or left
else peak is on left side or at mid
return left; // left == right is peak index
when left meets right, peak found
OutputSuccess
Peak element found at index 2 with value 5
Complexity Analysis
Time: O(log n) because we halve the search range each step
Space: O(1) because we use only a few variables, no extra space
vs Alternative: Linear scan takes O(n) by checking every element; binary search is faster with O(log n)
Edge Cases
Array with one element
Returns index 0 as peak since it's the only element
DSA Javascript
while (left < right) {
Strictly increasing array like [1,2,3,4]
Peak is last element because each next is bigger; binary search moves right until end
DSA Javascript
if (nums[mid] < nums[mid + 1]) {
Strictly decreasing array like [4,3,2,1]
Peak is first element; binary search moves left narrowing to start
DSA Javascript
else { right = mid; }
When to Use This Pattern
When you need to find a local maximum in an array quickly, use binary search on neighbors to jump towards a peak.
Common Mistakes
Mistake: Checking only mid element without comparing neighbors
Fix: Always compare mid with mid+1 to decide which side to search
Mistake: Using mid-1 without checking array bounds
Fix: Use mid+1 safely since mid < right, avoid out-of-bound errors
Summary
Finds an index of a peak element where neighbors are smaller.
Use when you want to find a local maximum efficiently in an unsorted array.
Compare middle element with next to decide which half contains a peak.

Practice

(1/5)
1. What is a peak element in an array when using binary search to find it?
easy
A. An element that is greater than its neighbors
B. The smallest element in the array
C. The first element of the array
D. An element equal to its neighbors

Solution

  1. Step 1: Understand the definition of a peak element

    A peak element is one that is strictly greater than its neighbors on both sides (or one side if at the boundary).
  2. Step 2: Compare options with the definition

    Only An element that is greater than its neighbors matches this definition exactly.
  3. Final Answer:

    An element that is greater than its neighbors -> Option A
  4. Quick Check:

    Peak element = greater than neighbors [OK]
Hint: Peak element is bigger than neighbors, not smallest or equal [OK]
Common Mistakes:
  • Thinking peak means smallest element
  • Confusing peak with first or last element
  • Assuming peak equals neighbors
2. Which of the following is the correct way to calculate the middle index mid in binary search in JavaScript?
easy
A. const mid = (left + right) / 2;
B. const mid = Math.ceil((left + right) / 2);
C. const mid = Math.floor((left + right) / 2);
D. const mid = left + right / 2;

Solution

  1. Step 1: Understand integer division in JavaScript

    JavaScript division returns a float, so we use Math.floor to get an integer index.
  2. Step 2: Check each option

    const mid = Math.floor((left + right) / 2); uses Math.floor on the average of left and right, which is correct for binary search.
  3. Final Answer:

    const mid = Math.floor((left + right) / 2); -> Option C
  4. Quick Check:

    Use Math.floor for integer mid index [OK]
Hint: Use Math.floor((left + right) / 2) for mid index [OK]
Common Mistakes:
  • Not using Math.floor causes float index
  • Using only division without parentheses
  • Incorrect operator precedence in calculation
3. What will be the output of the following code snippet?
function findPeak(nums) {
  let left = 0, right = nums.length - 1;
  while (left < right) {
    const mid = Math.floor((left + right) / 2);
    if (nums[mid] > nums[mid + 1]) {
      right = mid;
    } else {
      left = mid + 1;
    }
  }
  return left;
}

console.log(findPeak([1, 3, 2, 4, 1]));
medium
A. 3
B. 1
C. 2
D. 0

Solution

  1. Step 1: Trace the binary search steps on array [1,3,2,4,1]

    Initial left=0, right=4. mid=2 (value=2). Compare nums[2]=2 and nums[3]=4. Since 2 < 4, left=mid+1=3.
  2. Step 2: Next iteration with left=3, right=4

    mid=3 (value=4). Compare nums[3]=4 and nums[4]=1. Since 4 > 1, right=mid=3.
  3. Step 3: Loop ends as left=right=3

    Return left=3, which is index of peak element 4.
  4. Final Answer:

    3 -> Option A
  5. Quick Check:

    Peak index = 3 [OK]
Hint: Compare mid and mid+1 to decide left or right [OK]
Common Mistakes:
  • Returning value instead of index
  • Not updating left or right correctly
  • Confusing mid calculation
4. Identify the bug in this binary search code to find a peak element:
function findPeak(nums) {
  let left = 0, right = nums.length - 1;
  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (nums[mid] < nums[mid + 1]) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  return left;
}
medium
A. The comparison should be nums[mid] > nums[mid + 1] instead of <.
B. The mid calculation is incorrect.
C. The return statement should return right instead of left.
D. The loop condition should be left < right instead of <=.

Solution

  1. Step 1: Analyze the loop condition

    The loop uses left <= right, which can cause mid+1 to go out of bounds when mid = right.
  2. Step 2: Correct loop condition for safe mid+1 access

    Changing to left < right ensures mid+1 is always valid inside the loop.
  3. Final Answer:

    The loop condition should be left < right instead of <=. -> Option D
  4. Quick Check:

    Loop condition left < right avoids out-of-bounds [OK]
Hint: Use left < right to avoid mid+1 overflow [OK]
Common Mistakes:
  • Using <= causes index out of range error
  • Changing mid calculation unnecessarily
  • Returning wrong index
5. Given a strictly increasing then strictly decreasing array nums, how can you modify the binary search to find the peak element efficiently?
Choose the best approach.
hard
A. Use binary search comparing nums[mid] and nums[mid-1], move left or right accordingly.
B. Use binary search comparing nums[mid] and nums[mid+1], move left or right accordingly.
C. Scan the array linearly from start to find the maximum element.
D. Sort the array first, then pick the middle element.

Solution

  1. Step 1: Understand the array shape

    The array increases then decreases, so the peak is the maximum element where nums[mid] > nums[mid+1].
  2. Step 2: Use binary search comparing nums[mid] and nums[mid+1]

    If nums[mid] > nums[mid+1], move right pointer to mid; else move left pointer to mid+1.
  3. Step 3: Avoid linear scan or sorting

    Linear scan is O(n), sorting changes order and is unnecessary.
  4. Final Answer:

    Use binary search comparing nums[mid] and nums[mid+1], move left or right accordingly. -> Option B
  5. Quick Check:

    Compare mid and mid+1 for peak in bitonic array [OK]
Hint: Compare mid and mid+1 to find peak in bitonic array [OK]
Common Mistakes:
  • Using linear scan instead of binary search
  • Sorting array destroys peak property
  • Comparing mid and mid-1 incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard