在数组中查找下一个更大的元素
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。
给定一个数组,对于每个元素,我需要找到给定元素右侧大于当前元素的最小元素。
在数学上,
对于数组 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。