题目
https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/
代码1
使用两个栈,一个栈记录数值,一个栈记录位置
注意javascript里没有栈这个概念,所以用array来模拟,生成array的时候,不能指定数组长度。
不然就会出现[ undefined, undefined, undefined, 1, 2, 3....这样的情况]
/**
* @param {number[]} arr
* @return {number}
*/
var peakIndexInMountainArray = function(arr) {
let value = Array();
value.push(arr[0]);
let pos =Array();
pos.push(0);
for (let i = 0; i < arr.length; i++){
if (arr[i] > value[value.length - 1]){
pos.push(i);
value.push(arr[i]);
}else{
pos.push(pos[pos.length - 1]);
value.push(value[value.length - 1]);
}
}
return pos[pos.length - 1]
};
代码2
利用山峰左侧递增,山峰右侧递减的的性质搞二分
为什么是left < right, 而不是left <= right? 这是因为right = mid
为什么是right = mid ? 因为如果right左移(也就是mid[i + 1] < mid[ i ]) ,峰值是有可能出现在mid处的,所以不能是right = mid -1 ;
/**
* @param {number[]} arr
* @return {number}
*/
var peakIndexInMountainArray = function(arr) {
//根据mid的大小比较来决定
//如果mid右侧比mid大,那么,峰值一定在mid右侧,且肯定不出现在mid位置(mid, ...)
//如果mid右侧比mid小,那么峰值一定出现在[.... ,mid]
let left = 0;
let right = arr.length - 1;
while (left < right){
let mid = left + Math.floor((right - left)/2);
if (arr[mid] < arr[mid + 1]){
left = mid + 1;
}else{
right = mid;
}
}
return right;
};