【问题标题】:Find the next greater element in an array [duplicate]在数组中查找下一个更大的元素[重复]
【发布时间】:2016-07-12 05:57:10
【问题描述】:

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

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

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

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

蛮力解决方案是O(n^2),我希望做得更好。我在想O(n log n) 解决方案可以使用自平衡 BST,但这似乎相当复杂。此外,我需要O(n) 解决方案。

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

【问题讨论】:

  • 您需要查找每个索引吗?还是只有给定的索引?
  • 所以输入是Ai,所需的输出是j,s.t.规定的条件成立吗?
  • 所有索引都需要它。不仅仅是一个。输入是A,输出是一个数组B,其中包含所有索引ji
  • 你的蛮力尝试是什么样的?
  • 从索引 i+1 开始,一直遍历到结束,跟踪大于A[i] 的最小元素。

标签: arrays algorithm asymptotic-complexity


【解决方案1】:

O(nlogn) 下限证明:(用于基于比较的算法)

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

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

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

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

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

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

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

然后对于遇到的每个新元素,将其插入 BST 将获得对应的最近较大的索引/值。

【讨论】:

  • 我们无法完全按照您描述的方式进行排序。我们在它的右边只有更大的元素,而不是整体。你能澄清一下吗?
  • @AkashdeepSaluja 我们在它的右边找到了较大的元素(比如 R[i])。类似地,我们可以通过反向运行该算法来找到其左侧的直接较大元素(例如 L[i])。这意味着有直接较大的元素 = min (R[i], L[i])。
  • 也可以在O(n log n)算法上通过在原始数组中创建一个包含值和索引的类型并将它们排序为值。
  • @Codor,我们想要立即更大的元素“向右”。排序后,如何在 O(n) 时间内为每个元素确定其右侧的直接较大元素?
  • 只有在我们的算法是基于比较的情况下,您的下限证明才成立。我们可能会想出类似计数排序的方法并获得 O(n+k) 解决方案,其中k 取决于数组中的最大值。
猜你喜欢
  • 2014-07-28
  • 2022-06-22
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多