【问题标题】:Counting the numbers in array that are on left and are bigger than element计算数组中左侧且大于元素的数字
【发布时间】:2016-12-24 10:56:45
【问题描述】:

我需要帮助解决这个问题,我已经给出了 N 个元素的数组,并且我想生成一个新数组,对于每个索引,我将保留该索引左侧有多少个数字并且大于该元素。

假设我们有这个数组 {3,2,1,0},我想生成这个数组 {0,1,2,3}。在第二个数组中,我们有零,因为元素 3 的左边没有元素,我们有 1,因为数字 3 在数字 2 的左边,而且它更大......

我认为这可以用二叉索引树来完成,但我不知道如何实现它。

提前致谢。

【问题讨论】:

  • 你对运行时间有什么限制吗?在 n^2 复杂度中实现是相当简单的。
  • 我知道它可以在 N^2 复杂度下完成,但我想要 NlogN 复杂度的解决方案

标签: arrays computer-science


【解决方案1】:

您可以在 NlogN 中通过构建二叉树并在沿途的节点上保存一些元数据来做到这一点 - 即每个节点的右子树的当前大小。添加每个元素后,您可以计算之前添加到树中的大于它的元素的数量。我将假设您知道如何通过一一插入节点来创建二叉搜索树。所以让我们把它分成两件我们需要做的事情:

维护每个节点右子树的大小: 在每个节点上,我们选择当前值是在右子树(当前值大于节点值)还是左子树。如果我们选择向右,则将 rightSubtreeSize 的值加一。

计算之前插入的元素有多少比当前元素大:假设对于每个节点我们知道右子树的大小,我们现在可以计算左子树有多少个元素当前元素大于它(即左侧的元素已添加到树中)。同样,我们遵循二叉树插入操作。在每个节点上,如果当前值小于该节点,则表示该节点及其整个右子树都大于当前值。所以对于我们遍历的每个节点,我们保留所有大于当前值的元素的总和。当我们完成插入树时,我们得到了我们正在寻找的总和。

如果您需要任何说明,请告诉我。

【讨论】:

  • 很好的解决方案,但是,您需要插入 AVL 以获得 logN 高度。否则,它是 O(N^2) 对于排序数组,你将得到 N 的高度而不是 logN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多