首页 > 试题广场 >

寻找峰值

[编程题]寻找峰值
  • 热度指数: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。 
so easy....   判断最后一个的情况 如果如何直接返回。  然后循环     比较  更新 res
public int solve (int[] a) {
       
        
        int res=0;
        if(a[0]>=a[1]) res=0;
        if(a[a.length-1]>=a[a.length-2])
        {
            res=a.length-1;
            return res;
        }
        for(int i=1;i<a.length-1;i++)
        {
           
            if(a[i+1]<=a[i]&&a[i]>=a[i-1])
            {
                res=Math.max(res,i);
            }
        }
        
        return res;
    }

发表于 2021-10-15 20:09:59 回复(0)
import java.util.*;


public class Solution {
    /**
     * 寻找最后的山峰
     * @param a int整型一维数组 
     * @return int整型
     */
    public int solve (int[] a) {
        if(a ==null || a.length < 3){
            return -1;
        }

        int maxIndex = -1;
        for (int i = 1; i < a.length - 1; i++) {
            if (a[i - 1] <= a[i] && a[i] >= a[i + 1]) {
                maxIndex = Math.max(maxIndex, i);
            }
        }
        return maxIndex;
    }
}

发表于 2021-09-12 21:49:53 回复(0)
import java.util.*;


public class Solution {
    /**
     * 寻找最后的山峰
     * @param a int整型一维数组
     * @return int整型
     */
    public int solve (int[] a) {
        // write code here
        int len=a.length;
        int index=0;
        for(int i=1;i<=len-2;i++){
            if(a[i]>=a[i-1] && a[i]>=a[i+1]){
                    index=i;
            }
        }
        if(a[len-1]>a[len-2]){
            return len-1;
        }
        return index;
    }
}

发表于 2021-09-07 21:29:51 回复(0)
    public int solve (int[] a) {
        // write code here
        int index = 0;
        int max = Integer.MIN_VALUE;
        
        for(int i = 1; i < a.length-1; i++){
            if(a[i] >= a[i-1] && a[i] >= a[i+1]){
                index = i;
                max = a[i];
            }
        }
        
        if(a[a.length-1] >= a[a.length-2]){
            return a.length-1;
        }
        
        return index;
    }
发表于 2021-08-22 21:34:55 回复(0)
import java.util.*;
// 讨论区老哥的解法

public class Solution {
    public int solve (int[] a) {
        if(a==null || a.length<3) return -1;
        
        // 不存在相等的情况
        // nums[i-1] < nums[i] > nums[i+1]
        int ans = 0;
        for(int i=a.length-1; i>0; i--) 
            if(a[i-1]<a[i]) return i;
        
        return 0;
    }
}

发表于 2021-08-10 10:14:58 回复(0)
注意,是找最大的索引,不是找最大的山峰
发表于 2021-08-08 18:14:16 回复(0)
想的太复杂了。。注意题目是:最大索引的山峰,而不是最大山峰的索引
所以倒序遍历,找到第一个山峰直接break跳出循环
    public int solve (int[] a) {
        // write code here
        int index = 0;
        for (int i = a.length - 1; i > 0; i--) {
            if (a[i] >= a[i - 1]) {
                index = i;
                break;
            }
        }
        return index;
    }


发表于 2021-07-16 12:53:14 回复(3)
import java.util.*;
public class Solution {
        public int solve (int[] a) {
        // write code here
        if(a.length==1)return 0;//如果只有一个数组元素
        int index=Integer.MIN_VALUE;
        if(a[a.length-1]>a[a.length-2]){//处理边界,
            index=a.length-1;
            return index;
        }
        if(a[0]>a[1]){//处理边界:
            index=0;
        }
        for(int i=1;i<a.length-1;i++){//非边界
            if(a[i]>a[i-1]&&a[i]>a[i+1]){//输出极大值的最后索引
                index=i;
            }
        }
        return index;
    }
}

发表于 2021-04-10 20:58:12 回复(0)
public int solve (int[] a) {
        // write code here
        for(int i = a.length-1; i >= 0; i--){
            if(a[i] >= a[i-1]){
                return i;
            }
        }
        return -1;
    }

发表于 2021-04-09 21:34:34 回复(1)
做错了2次,都是审题,1,寻找的是最大的索引,不是最大值的索引  2,右边没有值也算峰(也就是第一个判断返回)

需要注意的是:减少循环次数  1,最后一个值是符合的直接返回  2、  有峰值时要跳,因为有峰值的下一个必定不是峰值 3。从索引1开始到倒数时第二个索引
发表于 2021-03-28 15:12:33 回复(1)
public static int solve (int[] a) {
        // write code here
        int index=-1;
        if(a[a.length-1]>=a[a.length-2]){
            return a.length-1;
        }
        for(int i=a.length-2;i>=1;i--){
            if(a[i]>=a[i+1] && a[i]>=a[i-1])
                index=i;
            break;
        }
        return index;
    }
发表于 2021-03-04 17:08:01 回复(0)
[2,51,12,95,42,52,76,77,23,81,71,41,2,23,43,4,64,22,71,96,1,87,51,91,67,16,58,11,44,38,63,14,4,69,88,49,92,91,9,15,17,74,21,91,24,78,62,50,82,26,53,18,25,14,94,79,44,11,36,38,44,53,9,34,58,6,50,82,81,50,36,1,6,61,9,47,33,47,84,41,57,48,73,18]
z这个测试用例应该输出19吧,它输出82,是不是错了?
public int solve (int[] a) {
        // write code here
        ArrayList<Integer> list = new ArrayList<>();
        int x = 0;
        for(int i =1;i<=a.length-2;i++){
            if(a[i-1]<=a[i] && a[i+1]<=a[i]){
                list.add(a[i]);
            }
        }
        int j = Collections.max(list);
        for (int i = 0; i < a.length-1 ; i++) {
            if(a[i] == j){
                x=i;
            }
        }
        return x;
    }


发表于 2020-12-10 16:25:41 回复(7)
本题可以用循环,主要思路是通过循环来找山峰,即前一个值小于后一个值就是山峰。我们通过循环判断数组前一个值是否小于后一个值,如果是,则将下标值i赋值给index,如此,通过不断循环可以不断更新下标i,最后一个就是要寻找的索引最大的山峰。
public static int solve (int[] a) {
        // write code here
        int index=0;
        for(int i=1;i<a.length;i++){
            if(a[i-1]<a[i]){
                index=i;
            }

        }
        return index;


    }

    public static void main(String[] args) {
        int[] b = {1,2,4,5,3,7,9,11,2,33,43,9};
        int m = solve(b);
        System.out.println(m);
    }


发表于 2020-11-02 14:36:53 回复(1)

问题信息

上传者:牛客332641号
难度:
14条回答 5549浏览

热门推荐

通过挑战的用户