查找下一个更大元素的 Javascript 程序
给定一个数组,打印每个元素的下一个更大元素 (NGE)。元素 x 的下一个更大元素是数组中 x 右侧的第一个更大元素。对于不存在更大元素的元素,将下一个更大的元素视为-1。
例子:
- 对于数组,最右边的元素总是具有下一个更大的元素为 -1。
- 对于按降序排序的数组,所有元素的下一个较大元素为 -1。
- 对于输入数组 [4, 5, 2, 25],每个元素的下一个更大的元素如下。
Element NGE
4 --> 5
5 --> 25
2 --> 25
25 --> -1
d)对于输入数组 [13, 7, 6, 12},每个元素的下一个更大的元素如下。
Element NGE
13 --> -1
7 --> 12
6 --> 12
12 --> -1
方法1(简单)
使用两个循环:外部循环一一挑选所有元素。内循环为外循环选取的元素寻找第一个更大的元素。如果找到更大的元素,则将该元素打印为下一个,否则打印-1。
下面是上述方法的实现:
Javascript
Javascript
Javascript
输出
11 -- 13
13 -- 21
21 -- -1
3 -- -1
时间复杂度: O(N 2 )
辅助空间: O(1)
方法2(使用堆栈)
- 将第一个元素推入堆栈。
- 一个一个地选择其余的元素,然后循环执行以下步骤。
- 将当前元素标记为next 。
- 如果 stack 不为空,则将 stack 的顶部元素与next进行比较。
- 如果 next 大于顶部元素,则从堆栈中弹出元素。 next是弹出元素的下一个更大的元素。
- 当弹出的元素小于next时,继续从堆栈中弹出。 next成为所有此类弹出元素的下一个更大元素。
- 最后,压入栈中的下一个。
- 步骤 2 中的循环结束后,从堆栈中弹出所有元素并打印 -1 作为它们的下一个元素。
下图是上述方法的试运行:
下面是上述方法的实现:
Javascript
输出
11 --> 13
13 --> 21
3 --> -1
21 --> -1
时间复杂度: O(N)
辅助空间: O(N)
最坏的情况发生在所有元素都按降序排序时。如果元素按降序排序,则每个元素最多处理 4 次。
- 最初推入堆栈。
- 处理下一个元素时从堆栈中弹出。
- 因为下一个元素更小,所以被推回堆栈。
- 在算法的第 3 步中从堆栈中弹出。
如何以与输入相同的顺序获取元素?
上述方法可能不会以与输入相同的顺序生成输出元素。要实现相同的顺序,我们可以倒序遍历相同的
下面是上述方法的实现:
Javascript
输出
11 ---> 13
13 ---> 21
21 ---> -1
3 ---> -1
时间复杂度: O(N)
辅助空间: O(N)
有关详细信息,请参阅有关 Next Greater Element 的完整文章!