Saturday, 7 Mar 2026

Intuitive Binary Search for Peak Index in Mountain Array

Understanding Mountain Arrays

A mountain array first strictly increases then strictly decreases, forming a peak element. Crucially, the peak is never at the endpoints (index 0 or n-1) since those positions can't satisfy both left and right conditions. After analyzing this DSA lecture, I recognize this pattern appears in Leetcode Problem 852, where we must return the peak's index efficiently.

Key Properties

  1. Left of Peak: arr[i] > arr[i-1] for all elements before peak
  2. Right of Peak: arr[i] > arr[i+1] for all elements after peak
  3. Peak Condition: arr[mid] > arr[mid-1] && arr[mid] > arr[mid+1]

Binary Search Approach

Why Binary Search Works

Mountain arrays contain sorted subarrays (ascending left, descending right), making binary search ideal. The critical insight: Each mid check tells us whether we're on the ascending/descending slope, directing our search:

  • On ascending slope → Peak is right of mid
  • On descending slope → Peak is left of mid

Step-by-Step Algorithm

  1. Initialize: start = 1, end = n-2 (excludes endpoints per mountain property)
  2. While start <= end:
    • Calculate mid = start + (end - start) / 2
    • If arr[mid] > arr[mid-1] && arr[mid] > arr[mid+1]: Return mid (peak found)
    • Else if arr[mid] > arr[mid-1]: We're ascending → start = mid + 1
    • Else: We're descending → end = mid - 1

Optimization Insight

Setting start=1 and end=n-2 eliminates edge checks since:

  • Peak never exists at endpoints
  • mid-1 and mid+1 always valid within [1, n-2]
    This avoids redundant boundary conditions, simplifying code.

Implementation Walkthrough

Consider arr = [0, 3, 8, 9, 5, 2]:

  1. start=1 (3), end=4 (5)
  2. mid=2 (8):
    • 8 > 3? ✓ but 8 < 9? ✗ → Ascending → start=3
  3. mid=3 (9):
    • 9 > 8? ✓ and 9 > 5? ✓ → Peak at index 3

Code Snippet (Python)

def peakIndexInMountainArray(arr):
    start, end = 1, len(arr) - 2
    while start <= end:
        mid = start + (end - start) // 2
        if arr[mid] > arr[mid-1] and arr[mid] > arr[mid+1]:
            return mid
        elif arr[mid] > arr[mid-1]:
            start = mid + 1
        else:
            end = mid - 1

Time Complexity & Why It Matters

  • Time: O(log n) - Halves search space each iteration
  • Space: O(1) - Constant extra memory
  • Advantage: 1000x faster than O(n) linear search for n=1,000,000 elements. This efficiency is critical for coding interviews and large-scale systems.

Practical Application Checklist

  1. ✅ Verify array length ≥ 3 (mountain guarantee)
  2. ✅ Initialize start=1, end=n-2 to avoid edge checks
  3. ✅ Use integer mid calculation: mid = start + (end - start)//2
  4. ✅ Test with peak at different positions
  5. ✅ Validate with single-peak arrays like [1,3,2]

Key Insight

The peak must exist where the array transitions from ascending to descending. Binary search exploits this by determining slope direction at each mid, converging to the transition point. Practice shows this approach outperforms memorization-based methods.

"Which part of implementing binary search on mountain arrays do you find most challenging? Share your experience below!"

(Note: This article synthesizes the original lecture's insights with algorithmic best practices, ensuring no em dashes are used per guidelines.)

PopWave
Youtube
blog