Peak Index in a Mountain Array
Problem
Let's call an array arr
a mountain if the following properties hold:
arr.length >= 3
- There exists some
i
with0 < i < arr.length - 1
such that:arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
Given an integer array arr
that is guaranteed to be a mountain, return any i
such that arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
.
Example 1:
Input: arr = [0,1,0] Output: 1
Example 2:
Input: arr = [0,2,1,0] Output: 1
Example 3:
Input: arr = [0,10,5,2] Output: 1
Constraints:
3 <= arr.length <= 104
0 <= arr[i] <= 106
arr
is guaranteed to be a mountain array.
Solution
/**
* @param {number[]} arr
* @return {number}
*/
var peakIndexInMountainArray = function(arr) {
let lo = 0;
let hi = arr.length - 1;
while (lo <= hi) {
const mid = Math.floor((lo + hi) / 2);
if (arr[mid] < arr[mid + 1]) { // peak in range (mid, hi]
lo = mid + 1;
} else if (arr[mid - 1] > arr[mid]) { // peak in range [lo, mid)
hi = mid - 1;
} else { // peak in range [mid, mid]
return mid;
}
}
};
We will implement a binary search solution. Since we are trying to find the peak of the mountain, we only need to search on the half that is greater than arr[mid]
(ie. by checking arr[mid - 1]
and arr[mid + 1]
). If both are less, then arr[mid]
must already be the peak.