首页 > 试题广场 >

寻找峰值

[编程题]寻找峰值
  • 热度指数: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。 
public int solve (int[] a) {
    if(a == null || a.length == 0) {
        return -1;
    }
    for(int i = a.length -1;i>=1;i--) {
        if(a[i] >= a[i-1]) {
            return i;
        }
    }
    return 0;
}

发表于 2020-09-08 21:33:50 回复(8)
Python
从后往前扫描,山峰只要对比前一位即可,题目是最大索引=最后一个山峰
#
# 寻找最后的山峰
# @param a int整型一维数组 
# @return int整型
#
class Solution:
    def solve(self , a ):
        for i in range(len(a)-1,0,-1):
            if(a[i]>=a[i-1]):
                return i


发表于 2021-04-15 11:25:14 回复(2)
想的太复杂了。。注意题目是:最大索引的山峰,而不是最大山峰的索引
所以倒序遍历,找到第一个山峰直接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)
给的示例和题目的参数个数是不是不太匹配呀,solve 要求给数组和数组长度,示例却只给数组
发表于 2021-04-09 09:47:42 回复(1)
    public int solve (int[] a) {
        // write code here
        int ret=0;
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        for(int i=0;i<a.length;i++){
            if(!map.containsKey(a[i])){
              map.put(a[i],i);  
            }
        }
        Arrays.sort(a);
        ret=map.get(a[a.length-1]);
        return ret;
    }

[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],一脸闷逼,这个答案为啥是82,不应该是19吗?
发表于 2021-01-19 19:54:16 回复(9)
class Solution {
public:
    /**
     * 寻找最后的山峰
     * @param a int整型一维数组 
     * @param aLen int a数组长度
     * @return int整型
     */
    int solve(int* a, int aLen) {
        // write code here
        for (int i = aLen - 1; i >= 0; i--) {
            if ( a[i] > a[i - 1])  return i;
        }
        return 0;
    }
};
//由于a[-1]和a[n]都是无穷小 那么a[n-1]已经比右边大了 如果前面的a[n-2]比它小 就是峰 比它大那就继续向前找
//直到找到第一个比它小的数就是峰 因为从后往前 所以肯定是下标最大的峰 找不到就是第一项a[0] 返回0

编辑于 2020-11-13 00:15:53 回复(0)
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)
注意,是找最大的索引,不是找最大的山峰
发表于 2021-08-08 18:14:16 回复(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)
function solve(a: number[]): number {
    for (let i = a.length - 1; i > -1; i--)
        if (a[i] >= a[i - 1]) return i;
}

编辑于 2021-04-19 18:23:33 回复(0)
这道题有个技巧,就是补充两端两个最小值,可以避免一些判断
import sys

min_value = -sys.maxsize - 1


class Solution:
    def solve(self, a):
        arr = [min_value] + a + [min_value]
        for i in range(len(arr) - 2, -1, -1):
            if arr[i] > arr[i - 1] and arr[i] > arr[i + 1]:
                return i - 1




编辑于 2021-02-22 21:15:24 回复(0)
本题可以用循环,主要思路是通过循环来找山峰,即前一个值小于后一个值就是山峰。我们通过循环判断数组前一个值是否小于后一个值,如果是,则将下标值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)
做错了2次,都是审题,1,寻找的是最大的索引,不是最大值的索引  2,右边没有值也算峰(也就是第一个判断返回)

需要注意的是:减少循环次数  1,最后一个值是符合的直接返回  2、  有峰值时要跳,因为有峰值的下一个必定不是峰值 3。从索引1开始到倒数时第二个索引
发表于 2021-03-28 15:12:33 回复(1)
#
# 寻找最后的山峰
# @param a int整型一维数组
# @return int整型
#
class Solution:
    def solve(self , a ):
        if len(a) ==0:
            return -1
        i = len(a) - 1
        while i < len(a):
            if (a[i] >= a[i-1]):
                return i
                break
            else:
                i = i - 1
通过循环反向去比较就可以了,前一个值小于后一个值就是峰值。
之前写的时候犯的错误:把值和前一个、后一个都进行比较:a[i] >= a[i-1] & a[i] >= a[i+1],其实完全没必要。

发表于 2021-01-27 15:32:18 回复(0)
import java.util.*;


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

发表于 2022-07-23 08:20:58 回复(0)
#
# 寻找最后的山峰
# @param a int整型一维数组 
# @return int整型
#
class Solution:
    def solve(self , a ):
        # write code here
        n = len(a)
        res = -1 
        a.insert(0,-1)
        a.append(-1)
        for i in range(n+1):
            if a[i] > a[i-1] and a[i] > a[i+1]:
                res = i 
        return res -1

发表于 2022-02-19 15:49:57 回复(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)
/**
 * 寻找最后的山峰
 * @param a int整型一维数组 
 * @param aLen int a数组长度
 * @return int整型
 */
int solve(int* a, int aLen ) {
    // write code here
    int i,*p,max,num;
    p=a;
    max=0;
    for(i=0;i<aLen;i++)
       if(p[i-1]<p[i]&&p[i+1]<=p[i])
           num=i;
    return num;
}
发表于 2021-09-04 10:26:17 回复(0)
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)

问题信息

上传者:牛客332641号
难度:
78条回答 5506浏览

热门推荐

通过挑战的用户