/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
function findPeakElement(nums) {
// write code here
function getIndex(list, l, r) {
if (l < r) {
// 取中位数下标
let mid = parseInt((l + r) / 2);
let cur = list[mid];
let last = list[mid - 1];
let next = list[mid + 1];
// console.log("last:", last, " cur:", cur, " next:", next);
if (last < cur && cur > next) {
// 若中位数大于两侧,则返回下标
return mid;
} else if (last < cur && cur < next) {
// 若中位数大于左侧且小于右侧,则在右半边查找
return getIndex(list, mid + 1, r);
} else {
// 其余情况,则在左半边查找
return getIndex(list, l, mid);
}
} else if (l == r) {
// 当搜索范围是1时,直接比较即可
let cur = list[l];
let last = list[l - 1];
let next = list[l + 1];
// console.log("last:", last, " cur:", cur, " next:", next);
if (last < cur && cur > next) {
// 若中位数大于两侧,则返回下标
return l;
} else {
// 若中位数非峰值,则返回0
return 0;
}
}
}
let len = nums.length;
// 在数组最左侧和最右侧添加下溢哨兵,防止取数下标异常报错
let index = getIndex([-100007, ...nums, -100007], 1, len);
// console.log("index:", index);
// 因为添加了边界哨兵,所以需要在得到的下标基础上减一
return index - 1;
}
module.exports = {
findPeakElement: findPeakElement,
};