Find Peak Element Using Binary Search in DSA Javascript - Time & Space Complexity
We want to know how fast the binary search method finds a peak element in an array.
How does the number of steps change as the array gets bigger?
Analyze the time complexity of the following code snippet.
function findPeakElement(nums) {
let left = 0, right = nums.length - 1;
while (left < right) {
let mid = Math.floor((left + right) / 2);
if (nums[mid] > nums[mid + 1]) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
This code finds a peak element by repeatedly narrowing the search range using binary search.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop that halves the search range each time.
- How many times: About log base 2 of the input size times (because the range halves each step).
Each step cuts the search area in half, so the number of steps grows slowly as the array gets bigger.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 4 steps |
| 100 | About 7 steps |
| 1000 | About 10 steps |
Pattern observation: Doubling the input size adds only one extra step.
Time Complexity: O(log n)
This means the steps needed grow slowly, making the search very efficient even for large arrays.
[X] Wrong: "The loop runs once for each element, so it is O(n)."
[OK] Correct: The search range halves each time, so the loop runs much fewer times than the number of elements.
Understanding how binary search reduces work quickly is a key skill that shows you can write fast and smart code.
"What if we changed the array to be sorted and wanted to find a specific value instead of a peak? How would the time complexity change?"
Practice
peak element in an array when using binary search to find it?Solution
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).Step 2: Compare options with the definition
Only An element that is greater than its neighbors matches this definition exactly.Final Answer:
An element that is greater than its neighbors -> Option AQuick Check:
Peak element = greater than neighbors [OK]
- Thinking peak means smallest element
- Confusing peak with first or last element
- Assuming peak equals neighbors
mid in binary search in JavaScript?Solution
Step 1: Understand integer division in JavaScript
JavaScript division returns a float, so we use Math.floor to get an integer index.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.Final Answer:
const mid = Math.floor((left + right) / 2); -> Option CQuick Check:
Use Math.floor for integer mid index [OK]
- Not using Math.floor causes float index
- Using only division without parentheses
- Incorrect operator precedence in calculation
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]));Solution
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.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.Step 3: Loop ends as left=right=3
Return left=3, which is index of peak element 4.Final Answer:
3 -> Option AQuick Check:
Peak index = 3 [OK]
- Returning value instead of index
- Not updating left or right correctly
- Confusing mid calculation
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;
}Solution
Step 1: Analyze the loop condition
The loop usesleft <= right, which can cause mid+1 to go out of bounds when mid = right.Step 2: Correct loop condition for safe mid+1 access
Changing toleft < rightensures mid+1 is always valid inside the loop.Final Answer:
The loop condition should beleft < rightinstead of <=. -> Option DQuick Check:
Loop conditionleft < rightavoids out-of-bounds [OK]
left < right to avoid mid+1 overflow [OK]- Using <= causes index out of range error
- Changing mid calculation unnecessarily
- Returning wrong index
nums, how can you modify the binary search to find the peak element efficiently?Choose the best approach.
Solution
Step 1: Understand the array shape
The array increases then decreases, so the peak is the maximum element where nums[mid] > nums[mid+1].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.Step 3: Avoid linear scan or sorting
Linear scan is O(n), sorting changes order and is unnecessary.Final Answer:
Use binary search comparing nums[mid] and nums[mid+1], move left or right accordingly. -> Option BQuick Check:
Compare mid and mid+1 for peak in bitonic array [OK]
- Using linear scan instead of binary search
- Sorting array destroys peak property
- Comparing mid and mid-1 incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
