计算数组中左边的数字并且大于元素

时间:2016-12-24 10:56:45

标签: arrays computer-science

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

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

我认为这可以通过二进制索引树完成,但我不知道如何实现它。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以在NlogN中通过构建二叉树并在整个节点上保存一些元数据(即每个节点的右子树的当前大小)来执行此操作。添加每个元素后,您可以计算先前添加到树中的元素数量大于它的元素数量。我将假设你知道如何通过逐个插入节点来创建二叉搜索树。因此,让我们将其分为两件事:

维护每个节点的右子树的大小:在每个节点处,我们选择当前值是否在右子树上(当前值大于节点值)或左子树。如果我们选择向右移动,则将rightSubtreeSize的值递增1。

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

如果您需要任何澄清,请告诉我。