0

给定一个N-length 数组B,求 , 的排列[1 .. N]A即对于所有大于 的索引,其中大于B[i]的元素数。AA[i]i

例子:N = 4, B=[1 1 1 0]

输出 :A=[3 2 1 4]

谁能帮我解决这个问题的算法?

进一步解释: 在 index 之后B[i]的项目数大于A[i]数组中的数。即对于所有大于 的索引。例如:这意味着在第三个元素之后有一个大于的元素。A[]iiB[2]=1A[]A[2]

提前致谢

4

2 回答 2

3

这似乎可行:从临时列表开始T := [ N, N-1, N-2, ..., 3, 2, 1 ]。这个列表像C# 中0的a 一样被索引。N-1List<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 代码

于 2013-08-25T21:07:58.917 回答
0

我想到的答案之一是以下算法:

For i = N to 1
   A[i] = N - B[i]
   For j = i+1 to N
      If A[j] <= A[i]
         A[j]--
于 2013-08-24T23:36:57.470 回答