algorithm - 为每个元素在数组中查找下一个更高的元素

标签 algorithm data-structures

<分区>

从给定的输入数组中,对于每个元素,找到每个数组中存在的下一个更高的元素。例如 {40,50,11,32,55,68,75} 输出应该是 {50,55,32,55,68,75,-1} .对于元素,如果不存在更高的元素,则打印 -1。

复杂度应小于 O(n^2)。您可以使用数据结构并且不受空间复杂度的限制。

最佳答案

您可以使用堆栈,时间复杂度为 O(N)

算法:
从左侧开始,向右移动。当您从数组中选择一个元素(假设为 x)时,弹出堆栈,直到堆栈中的元素(假设为 y)具有大于数组元素的元素,即 x> y。然后将元素即 x 插入堆栈。

例如{40,50,11,32,55,68,75}。这里 s 是堆栈。

40,因为s是空的push它。 s: 40

50,因为 s.peek() < 50 所以弹出 40(40 的更大元素是 50)然后压入 50。s: 50

Next higher element of 40 - 50.

11, s.peek() > 11 所以按 11。s: 50, 11

32,s.peek() < 32,所以弹出元素,现在它是 50,大于 32,因此推送 32。s: 50 ,32

Next higher element of 11 - 32.

55,s.peek() < 55,所以弹出元素,即 32 然后弹出下一个以及 50 < 55,然后推送 55。s: 55

Next higher element of 32 - 55.

Next higher element of 50 - 55.

68, s.peek() < 68 所以弹出它并按下 68。s: 68

75,s.peek() < 75 所以弹出它并按下 75 s:75

Next higher element of 68 - 75.

由于数组没有任何元素,所以不只是弹出堆栈说对于数组内的所有元素都没有更大的元素,即-1。

Next higher element of 75 - -1.

代码中的相同算法:

public static void getNGE(int[] a) {
    Stack<Integer> s = new Stack<Integer>();
    s.push(a[0]);

    for (int i = 1; i < a.length; i++) {
        if (s.peek() != null) {
            while (true) {
                if (s.peek() == null || s.peek() > a[i]) {
                    break;
                }
                System.out.println(s.pop() + ":" + a[i]);
            }
        }
        s.push(a[i]);
    }
    while (s.peek() != null) {
        System.out.println(s.pop() + ":" + -1);
    }
}

关于algorithm - 为每个元素在数组中查找下一个更高的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19720349/

相关文章:

string - 后缀树如何工作?

c++ - map 大小变为零并返回 NULL

algorithm - QBasic 中狐兔追逐模拟的最佳方式

python - 寻找一种有效的方法来操作 JSON 数据

algorithm - 粒子群优化(PSO)算法中位置向量和速度向量的内容(元素)是什么?

python - python如何识别参数的类型?

python - 如何根据列值合并数据框中的行?

java - 哈希的内部工作。 put和get方法实现

algorithm - 在 3D 中找到最大数量的共线点

java - 在插入 BST 期间获取实际索引