山脉数组的峰顶索引:开口向上的抛物线
#算法/二分搜索
目录
题目
- 是山脉数组(先增后减)
- 只有一个峰值
- 没有相等的相邻元素
方法一:内置方法
var peakIndexInMountainArray = function (arr) {
return arr.indexOf(Math.max(...arr));
};
方法二:线性扫描:找到第一个下坡的地方即可
var peakIndexInMountainArray = function(arr) {
for (let i = 1; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
return i;
}
}
return -1; // 实际上永远不会执行到这里
};
方法三:二分
var peakIndexInMountainArray = function (arr) {
let left = 0;
let right = arr.length - 1;
while (left < right) {
const mid = Math.floor((left + right) / 2);
if (arr[mid] < arr[mid + 1]) {
// 在上坡,峰值在右边
left = mid + 1;
} else {
// 在下坡,峰值在左边(包括mid)
right = mid;
}
}
return left; // 或者返回right,因为循环结束时left==right
};