当前位置: 首页 > 知识库问答 >
问题:

数组中的峰值元素

卢德惠
2023-03-14

所以我试图解决以下问题:

给定一个整数数组。找到其中的峰值元素。如果数组元素不小于其相邻元素,则该元素为峰值。对于角元素,我们只需要考虑一个邻居。例如,对于输入数组{5,10,20,15},20是唯一的峰值元素。对于输入数组{10、20、15、2、23、90、67},有两个峰值元素:20和90。请注意,我们需要返回任何一个峰值元素。

从以下链接:http://www.geeksforgeeks.org/find-a-peak-in-a-given-array/

有一次他们说

如果中间元素小于其左邻居,则在左半部分总是有一个峰值。

我在这一点上感到困惑,我们如何确定在左半部分会有一个峰值元素?我能从中得出的结论是,至少有1个元素肯定比它的右邻居(即a[m-1])大,所以有可能是峰值元素。我已经研究了stackoverflow和其他站点,但无法找到对上述结论的良好解释

谢谢你的帮助!

共有3个答案

满俊楠
2023-03-14
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

/**
 * @author asharda
 *
 */
public class Peak {

  public int findPeakElement(int[] nums) {

    Integer[] num = new Integer[nums.length];
    for (int i = 0; i < nums.length; i++) {
      num[i] = Integer.valueOf(nums[i]);
    }
    ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(num));
    Collections.sort(list);
    int peak = list.get(list.size() - 1);
    int top = 0;
    for (int i = 0; i < nums.length - 1; i++) {
      if (nums[i] == peak) {
        top = i;
      }
    }

    return top;
  }

  public static void main(String[] args) {

    int nums[] = {1, 2, 1, 3, 5, 6, 4};
    Peak p = new Peak();
    System.out.println(p.findPeakElement(nums));

  }

}
益银龙
2023-03-14

这句话很重要:

对于角元素,我们只需要考虑一个邻居。

让我们看看从中间元素向左迭代时会发生什么。我们知道左边的那个更大。如果它左边的一个更小或相等,那么你会发现一个峰值。如果不是,则递归。

这种递归有两种可能性:要么你最终找到一个峰值,要么你到达终点。如果你到达终点,那么末端的元素是你迄今为止找到的最大的元素,因此根据角落元素的定义,它是一个峰值。

山翼
2023-03-14

假设您站在一个中间元素上,该元素低于其左邻居:

            element
                         you
                       element

你往左边看。它看起来像一座山。

假设你爬那座山。你看到了什么?有三种可能性:

1.
  element
              you
            element

                       element

2.
              you
  element   element

                       element

3.
              you
            element

  element              element

在第二种和第三种情况下,万岁!你找到了一个顶峰。在第一种情况下,你继续攀升。最终,要么你看到一个不高于你的元素,要么你撞上了左边的墙。在任何一种情况下,你都找到了一个顶峰。

 类似资料:
  • 本文向大家介绍在C ++中查找2D数组中的峰元素,包括了在C ++中查找2D数组中的峰元素的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序来查找2D数组中的峰值元素。 如果周围所有元素均小于该元素,则该元素称为峰元素。 让我们看看解决问题的步骤。 用伪数据初始化2D数组。 遍历2D数组。 首先,检查2D数组的角元素。 接下来,编写2D数组的第一行和最后一行的条件。 现在,检

  • 本文向大家介绍在C ++中查找峰值元素,包括了在C ++中查找峰值元素的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序来查找给定数组中的峰元素 峰值元素是大于周围元素的元素。让我们看看解决问题的步骤。 用伪数据初始化数组。 检查第一个元素和最后一个元素的峰值元素状况。 从第二个元素遍历数组。 检查当前元素是否大于上一个元素和下一个元素。 如果上述条件满足,则返回。 打印结果

  • 我不明白为什么它能很好地适用于较小的输入,而且如果我把输入大小改成1000,传递一个包含1000个元素和978个最大值的数组,那么它能很好地工作,但我不能提交它。我使用的平台是GeeksforGeeks。

  • 本文向大家介绍在C ++的链接列表中查找峰值元素,包括了在C ++的链接列表中查找峰值元素的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序,该程序在给定的链表中查找峰值元素。 峰值元素是大于周围元素的元素。让我们看看解决问题的步骤。 为链表创建一个struct节点。 用伪数据创建链接列表。 检查基本情况,例如链表是否为空或长度为1。 将第一个元素存储在一个名为previou

  • 本文向大家介绍php获取数组元素中头一个数组元素值的实现方法,包括了php获取数组元素中头一个数组元素值的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php获取数组元素中头一个数组元素值的实现方法。分享给大家供大家参考。具体如下: 在php的内置函数中,获取数组元素值的函数主要有 reset next current prev end 这几个函数. reset (PHP 3,

  • 如果这是个愚蠢的问题,请原谅。骆驼洞对我来说是新鲜事,所以我真的没有“全球视野”。我喜欢在camel安装中使用队列。我发现ActiveMQ是一个解决方案,然后偶然发现了两个不同的组件(或uri):ActiveMQ和JMS。 由于ActiveMQ正在实现JMS 1.1,使用这两种URI有什么区别?或者换句话说:我可以同时使用这两种方法吗?如果可以,在哪些情况下应该使用哪一种?