解释
峰值元素是指其值大于左右相邻值的元素。 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。 你可以假设 nums[-1] = nums[n] = -∞。
示例
输入: nums = [1,2,3,1] 1
输出: 2 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。
方法一
- 使用数组的 reduce 方法遍历数组,设其初始值为 0。
- 当遍历到的值大于上一次返回的下标所对应的值时返回当前下标。
- 遍历结束后所获取的值为最终答案。
function findPeakElement(arr){
return arr.reduce((index, cur, i) => {
if(arr[index] < cur){
return i
}
return index
})
}
方法二
function findPeakElement(arr) {
// 如果全部从小到大排列,则峰值为最后一个元素
let result = arr.length - 1;
// 否则只要找出第 i 个元素大于 i+1 个元素,则第 i 个元素就是峰值
for (let i = 0; i < arr.length - 1; i += 1) {
if (arr[i] > arr[i + 1]) {
result = i;
break;
}
}
return result;
}
方法三
function findPeakElement (nums) {
let lIndex = 0; // 虚拟数组第一个元素下标
let rIndex = nums.length - 1; // 虚拟数组最后一个元素下标
let mid; // 数组中间元素下标。
while (lIndex < rIndex) { // 当数组长度不为 1 时。
mid = Math.floor((lIndex + rIndex) / 2); // 取当前虚拟数组的中间元素的下标(当数组
if (nums[mid] > nums[mid + 1]) { // 比较左边数组最后一个元素与右边数组的第一个元素
rIndex = mid; // 左边数组最后一个元素大、则取左边数组
} else {
lIndex = mid + 1; // 右边数组第一个元素大、则取右边数组
}
}
return lIndex;
};