如何计算排列数量?

时间:2019-01-24 16:30:33

标签: c++ permutation

我们得到由正整数组成的数组'a'和数组'b'。 我如何计算在字典上严格小于数组“ b”的数组“ a”的所有排列?

数组可以包含多达10 ^ 5个整数(正数)

示例:

1 2 3在字典上小于3 1 2

1 2 3在字典上小于1 4 5。

我希望该解决方案使用C ++。

输入:3

1 2 3

2 1 3

输出:2

在字典上,排列1,2,3和1,3,2小于2 1 3

1 个答案:

答案 0 :(得分:1)

让我们来解决算法。一旦弄清楚了,实现应该非常简单。看起来像您想要的东西吗?

伪代码:

function get_perms(a,b)
    #count the number of digits in a that are <b[0]
    count = sum(a<b[0])
    Nperms = (len(a)-1)! #modify this formula as needed
    N = count*Nperms
    if sum(a==b[0]) > 0
        remove 1 b[0] from a
        # repeat the process with the substring assuming a[0]==b[0]
        N += sum(a==b[0])*get_perms(a,b[1:end])
    return N

main()
    get_perms(a,b)

编辑:我做了一些搜索。我相信this是您要找的东西。