在数组中查找下一个更大的元素

Find the next greater element in an array

给定一个数组,对于每个元素,我需要找到给定元素右侧大于当前元素的最小元素。

在数学上, 对于数组 A 中的每个索引 i,我需要找到索引 j 使得

A[j] > A[i]
j > i
A[j] - A[i] is minimum

我需要为每个索引找到 j i

蛮力解决方案是 O(n^2),我希望做得更好。我认为使用自平衡 BST 可以实现 O(n log n) 解决方案,但这看起来非常复杂。此外,我需要一个 O(n) 解决方案。

这个问题有O(n)解决方案吗?是否有证据表明下界是 O(n log n)?

O(nlogn) 下界的证明:(对于基于比较的算法)

假设我们有一个基于比较的算法可以在 O(n) 内完成此任务。也就是说,对于每个索引,我们都有其右侧的直接更大的元素(比如 R[i])。

同样我们可以运行这个算法对反转输入数组然后反转结果。对于每个索引,我们在其左侧都有直接的更大元素(比如 L[i])。

这意味着在 O(n) 中,对于每个元素,数组中的直接较大元素 = min (R[i], L[i])。

我们现在可以使用此信息对数组进行排序。

找到数组中的最小元素。找到它的后继者(直接更大的元素),然后是它的后继者的后继者等等。因此你会得到整个数组的排序顺序。

仅使用比较(矛盾)在 O(n) 中对数组进行排序。

O(nlogn) 算法:
从阵列右侧开始构建平衡 BST。节点将包含值和相应的索引。

然后对于每遇到一个新元素,将其插入到BST中会得到相应的最近较大的index/value。