首页 > 试题广场 >

寻找峰值

[编程题]寻找峰值
  • 热度指数:41153 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。

假设 nums[-1] = nums[n] = -∞。


提示:
1 <= 数组长度 <= 1000
0 <= 数组元素的值 <= 1000

如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:

按题目要求应该输出索引最大的山峰,所以对应的输出为5。
示例1

输入

[2,4,1,2,7,8,4]

输出

5
示例2

输入

[3,2,1,2,1]

输出

3

说明

因有两个山峰,一个是索引为0,峰值为3的山峰,另一个是索引为3,峰值为2的山峰,按题目要求应该输出索引最大的山峰,所以对应的输出为3。 
function solve( a ) {
    // write code here
    //题干是要找到索引最大的山峰元素
    //倒序遍历,a[i-1] < a[i] 输出 i
    for(let i=a.length-1;i>=1;i--){
        if(a[i-1]<=a[i]){
            return i;
        }
    }
    return 0;
}

发表于 2021-08-27 17:04:45 回复(1)
function solve( a ) {
    // write code here
    const result=[];
    a.push(-Infinity);
    a.unshift(-Infinity);
    for(let i=1;i<a.length-1;i++){
        if (a[i]>a[i-1] && a[i]>a[i+1]){
            result.push(i-1);
        }
    }
    return Math.max.apply(null,result);
}
module.exports = {
    solve : solve
};

发表于 2021-05-20 22:31:41 回复(0)
function solve( a ) {
    // write code here
    var pre,next;
    var len = a.length - 1;
    if(a[len] >= a[len-1]){
        return len;
    }
    for(var i = len-1; i >= 1; i--){
        pre = i - 1;
        next = i + 1;
        if(a[i] >= a[pre] && a[i] >= a[next]){
            return i;
        }
    }
    if(a[0] >= a[1]){
        return 0;
    }
}

发表于 2021-04-24 11:27:46 回复(0)
js解法:
解题关键:
由于是找到最后一个山峰,所以这道题注意要从后向前进行遍历,首先找到的那个山峰即是最后一个山峰。
如果遍历结束依然没有找到山峰,证明这是一个递减的数组,所以山峰是第一个元素,即索引为0的位置。

function solve( a ) {
    if(a == null || a.length == 0){return -1 };
    if(a.length ==1){return 0};
    if(a.length>1){
        for(let i = a.length-1;i>=0;i--){
        if(a[i] > a[i-1]){
           return  i;
        }
    }
    }
}
module.exports = {
    solve : solve
};



发表于 2021-02-02 00:15:12 回复(0)
因为返回众多索引值的最大值 所以逆序排序最优 
function solve( a ) {
    // write code here
    let len = a.length
    if(a == null || len ==0) return -1
    for(let i = len - 1;i>1;i--){
        if(a[i]>a[i-1]) return i // 进到这里说明 当前值已经大于左边 所以只需要比较是否大于右边
    }
    return 0
}

发表于 2020-12-28 11:32:46 回复(0)