Bird
Raised Fist0
DSA Goprogramming

Find Peak Element Using Binary Search in DSA Go

Choose your learning style10 modes available
Mental Model
A peak element is one that is bigger than its neighbors. We use binary search to quickly find such an element by checking the middle and deciding which half to search next.
Analogy: Imagine climbing a mountain range where you want to find a peak. Instead of walking the whole range, you look at the middle point and decide if you should go left or right based on which side is higher, because a peak must exist in that direction.
Array: [1, 3, 2, 4, 1]
Indexes:  0  1  2  3  4

Initial view:
start -> 0, end -> 4
mid -> 2 (value 2)
Neighbors: left=3, right=4
Dry Run Walkthrough
Input: array: [1, 3, 2, 4, 1]
Goal: Find any peak element index where element is greater than neighbors
Step 1: Calculate mid = (0 + 4) / 2 = 2; compare nums[mid] = 2 with nums[mid+1] = 4
[1, 3, 2, 4, 1]
start=0, end=4, mid=2
nums[mid]=2, nums[mid+1]=4
Why: If right neighbor is bigger, peak must be on right side
Step 2: Move start to mid + 1 = 3 to search right half
[1, 3, 2, 4, 1]
start=3, end=4
Why: We discard left half because peak must be on right side
Step 3: Calculate mid = (3 + 4) / 2 = 3; compare nums[mid] = 4 with nums[mid+1] = 1
[1, 3, 2, 4, 1]
start=3, end=4, mid=3
nums[mid]=4, nums[mid+1]=1
Why: nums[mid] > nums[mid+1], so peak could be at mid or left side
Step 4: Move end to mid = 3 to narrow search
[1, 3, 2, 4, 1]
start=3, end=3
Why: We narrow down to mid because it might be the peak
Result:
Peak found at index 3 with value 4
Annotated Code
DSA Go
package main

import "fmt"

func findPeakElement(nums []int) int {
    start, end := 0, len(nums)-1
    for start < end {
        mid := (start + end) / 2
        if nums[mid] < nums[mid+1] {
            start = mid + 1
        } else {
            end = mid
        }
    }
    return start
}

func main() {
    nums := []int{1, 3, 2, 4, 1}
    peakIndex := findPeakElement(nums)
    fmt.Printf("Peak found at index %d with value %d\n", peakIndex, nums[peakIndex])
}
mid := (start + end) / 2
Calculate middle index to check
if nums[mid] < nums[mid+1] {
Compare mid element with right neighbor to decide search direction
start = mid + 1
Move start to right half if right neighbor is bigger
end = mid
Move end to mid if mid is greater or equal to right neighbor
return start
Return the index where start meets end, the peak element
OutputSuccess
Peak found at index 3 with value 4
Complexity Analysis
Time: O(log n) because we halve the search space each step using binary search
Space: O(1) because we use only a few variables, no extra data structures
vs Alternative: Compared to linear scan O(n), binary search is faster for large arrays by reducing steps exponentially
Edge Cases
Single element array
Returns index 0 as the peak since it's the only element
DSA Go
start, end := 0, len(nums)-1
Strictly increasing array like [1,2,3,4]
Returns last index as peak because last element is greater than previous
DSA Go
if nums[mid] < nums[mid+1] { start = mid + 1 }
Strictly decreasing array like [4,3,2,1]
Returns first index as peak because first element is greater than next
DSA Go
else { end = mid }
When to Use This Pattern
When you need to find a local maximum in an array efficiently, use binary search on neighbors to reduce search space quickly.
Common Mistakes
Mistake: Checking only nums[mid] without comparing neighbors
Fix: Always compare nums[mid] with nums[mid+1] to decide which half contains a peak
Mistake: Using mid = (start + end + 1) / 2 causing infinite loop
Fix: Use mid = (start + end) / 2 and adjust start/end carefully to avoid infinite loops
Summary
Finds an index of a peak element where neighbors are smaller
Use when you want to find a local maximum quickly without scanning all elements
The key insight is comparing mid element with its right neighbor 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. An element that is smaller than its neighbors
C. The first element of the array
D. The last element of the array

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 only one side if at the boundary).
  2. Step 2: Apply this to binary search context

    Binary search finds such an element by comparing middle elements with neighbors to decide which half to search next.
  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 smaller [OK]
Common Mistakes:
  • Thinking peak is smallest element
  • Confusing peak with first or last element always
  • Ignoring boundary conditions
2. Which Go code snippet correctly initializes the binary search boundaries to find a peak element in array nums?
easy
A. left, right := 1, len(nums)
B. left, right := 0, len(nums) - 1
C. left, right := 0, len(nums)
D. left, right := 1, len(nums) - 1

Solution

  1. Step 1: Identify valid index range for array in Go

    Array indices in Go start at 0 and end at len(nums)-1, so boundaries must be set accordingly.
  2. Step 2: Check each option for correct boundary initialization

    left, right := 0, len(nums) - 1 correctly sets left=0 and right=len(nums)-1, covering full array indices.
  3. Final Answer:

    left, right := 0, len(nums) - 1 -> Option B
  4. Quick Check:

    Array indices 0 to len-1 [OK]
Hint: Array indices go from 0 to length-1 in Go [OK]
Common Mistakes:
  • Setting right to len(nums) (out of range)
  • Starting left at 1 and missing first element
  • Using negative indices
3. What will be the output index of the peak element for the array nums := []int{1, 3, 20, 4, 1, 0} using binary search peak finding?
medium
A. 3
B. 1
C. 2
D. 0

Solution

  1. Step 1: Identify peak candidates in the array

    Array: [1, 3, 20, 4, 1, 0]. 20 at index 2 is greater than neighbors 3 and 4, so it's a peak.
  2. Step 2: Confirm binary search finds index 2

    Binary search compares mid elements and moves left or right until it finds peak at index 2.
  3. Final Answer:

    2 -> Option C
  4. Quick Check:

    Peak at index 2 with value 20 [OK]
Hint: Peak is local max, here 20 at index 2 [OK]
Common Mistakes:
  • Choosing first or last element incorrectly
  • Confusing index with value
  • Not checking both neighbors
4. Given the following Go code snippet to find a peak element, what is the bug?
func findPeak(nums []int) int {
    left, right := 0, len(nums)-1
    for left < right {
        mid := (left + right) / 2
        if nums[mid] < nums[mid+1] {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return left
}
medium
A. The right boundary update should be right = mid, not mid - 1
B. The left boundary update should be left = mid, not mid + 1
C. The loop condition should be left <= right
D. The function should return right instead of left

Solution

  1. Step 1: Analyze the binary search boundary updates

    When nums[mid] >= nums[mid+1], peak is at mid or to the left, so right should be set to mid, not mid - 1 to avoid skipping mid.
  2. Step 2: Identify impact of wrong right update

    Using right = mid - 1 skips mid, possibly missing the peak element.
  3. Final Answer:

    The right boundary update should be right = mid, not mid - 1 -> Option A
  4. Quick Check:

    Right boundary must include mid [OK]
Hint: Use right = mid to keep mid in search space [OK]
Common Mistakes:
  • Setting right = mid - 1 and skipping mid
  • Changing left incorrectly
  • Wrong loop condition causing infinite loop
5. You have an array nums := []int{10, 20, 15, 2, 23, 90, 67}. Using binary search to find a peak element, which index will be returned and why?
hard
A. 1, because 20 is a peak greater than neighbors 10 and 15
B. 0, because first element is always a peak
C. 6, because last element is always a peak
D. 5, because 90 is a peak greater than neighbors 23 and 67

Solution

  1. Step 1: Identify all peak candidates in the array

    Array: [10, 20, 15, 2, 23, 90, 67]. Peaks are 20 at index 1 and 90 at index 5.
  2. Step 2: Understand binary search behavior

    Binary search compares mid and mid+1; it will move towards the higher peak 90 at index 5.
  3. Step 3: Confirm returned index

    Binary search will return index 5 where 90 is a peak greater than neighbors 23 and 67.
  4. Final Answer:

    5, because 90 is a peak greater than neighbors 23 and 67 -> Option D
  5. Quick Check:

    Binary search finds highest local peak at index 5 [OK]
Hint: Binary search finds any peak, often the higher one found first [OK]
Common Mistakes:
  • Assuming first or last element always peak
  • Choosing smaller peak incorrectly
  • Not understanding binary search direction
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