给定未排序的整数数组A,返回数组B,其中B [i]是A [j]的数,使得A [i]> A [j]而i< Ĵ

时间:2015-11-15 05:30:35

标签: algorithm

示例:A = [5,3,8,7,2,1,4]。 然后我们得到B = [4,2,4,3,1,0,0]。

有没有办法在O(n log n)中执行此操作?

2 个答案:

答案 0 :(得分:1)

a)从右到左工作,随时将值插入带注释的平衡树中。如果您在树中保留注释,告诉您每个节点下面的项目数,那么您可以计算出每个项目右侧的项目数量少于插入时的项目数量。这是一个平衡树,因此每个插入成本最多为log n,总成本为n log n。

b)划分并征服,在每个点将数组拆分为一半,并按排序顺序返回值,并为每一半计算B数组。合并时,需要进行排序,对于数组的左半部分,需要在数组的右半部分中添加少于自身值的数量。您可以在合并过程中执行此操作,但仍需要线性时间,因此成本通常是合并排序的n log n。

答案 1 :(得分:0)

您可以使用分段树结构(每个节点将存储其子项的总和)。分段树的所有节点最初都是0。从右到左开始检查[ai + 1,N]的总和。这将是B [i]然后当我通过更新ai。叶子为1.