给定一个N
-length 数组B
,求 , 的排列[1 .. N]
,A
即对于所有大于 的索引,其中大于B[i]
的元素数。A
A[i]
i
例子:N = 4, B=[1 1 1 0]
输出 :A=[3 2 1 4]
谁能帮我解决这个问题的算法?
进一步解释: 在 index 之后B[i]
的项目数大于A[i]
数组中的数。即对于所有大于 的索引。例如:这意味着在第三个元素之后有一个大于的元素。A[]
i
i
B[2]=1
A[]
A[2]
提前致谢
这似乎可行:从临时列表开始T := [ N, N-1, N-2, ..., 3, 2, 1 ]
。这个列表像C# 中0
的a 一样被索引。N-1
List<int>
拿T[B[0]]
。那是结果数组的第 0 个成员,所以设置A[0] := T[B[0]]
. 从 中删除此号码T
。该列表T
现在少了一个元素。它现在0
通过索引N-2
。
然后设置A[1] := T[B[1]]
,并从中删除该数字T
。依此类推,A[i] := T[B[i]]
在T
任何时候都只包含直到那时“未使用”的数字。
在伪代码中:
set T := [ N, N-1, N-2, ..., 3, 2, 1 ]
for (i from 0 through N-1)
A[i] := T[B[i]]
T.RemoveAtIndex(B[i])
问题中的示例B=[1 1 1 0]
, 如下所示:
T = [ 4, 3, 2, 1 ], A = [ ]
在 index 处读取和删除1
:
T = [ 4, 2, 1 ], A = [ 3 ]
在 index 处读取和删除1
:
T = [ 4, 1 ], A = [ 3, 2 ]
在 index 处读取和删除1
:
T = [ 4 ], A = [ 3, 2, 1 ]
在 index 处读取和删除0
:
T = [ ], A = [ 3, 2, 1, 4 ]
编辑:我发现这被称为Lehmer 代码。
我想到的答案之一是以下算法:
For i = N to 1
A[i] = N - B[i]
For j = i+1 to N
If A[j] <= A[i]
A[j]--