📜  计算排列,使序列不递减

📅  最后修改于: 2021-06-25 16:14:51             🧑  作者: Mango

给定整数数组arr [] ,任务是查找数组的排列数,以使排列按递增顺序进行,即arr [0]≤arr [1]≤arr [2]≤…≤arr [n – 1]
例子:

方法:序列应不降序,即arr [0]≤arr [1]≤arr [2]≤…≤arr [n – 1]
首先,对数组排序,然后关注所有元素都相等的块,因为这些元素可以在P中重新排列 P是该块的大小的方法。
排列该块不会违反给定条件。现在,找到所有元素均相等的所有块,并将该单个块的答案乘以最终答案,以获得可能排列的总数。
下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
#define N 20
 
// To store the factorials
int fact[N];
 
// Function to update fact[] array
// such that fact[i] = i!
void pre()
{
 
    // 0! = 1
    fact[0] = 1;
    for (int i = 1; i < N; i++) {
 
        // i! = i * (i - 1)!
        fact[i] = i * fact[i - 1];
    }
}
 
// Function to return the count
// of possible permutations
int CountPermutation(int a[], int n)
{
 
    // To store the result
    int ways = 1;
 
    // Sort the array
    sort(a, a + n);
 
    // Initial size of the block
    int size = 1;
    for (int i = 1; i < n; i++) {
 
        // Increase the size of block
        if (a[i] == a[i - 1]) {
            size++;
        }
        else {
 
            // Update the result for
            // the previous block
            ways *= fact[size];
 
            // Reset the size to 1
            size = 1;
        }
    }
 
    // Update the result for
    // the last block
    ways *= fact[size];
 
    return ways;
}
 
// Driver code
int main()
{
 
    int a[] = { 1, 2, 4, 4, 2, 4 };
    int n = sizeof(a) / sizeof(a[0]);
 
    // Pre-calculating factorials
    pre();
 
    cout << CountPermutation(a, n);
 
    return 0;
}


Java
//Java implementation of the approach
import java.util.Arrays;
import java.io.*;
 
class GFG
{
static int N = 20;
 
// To store the factorials
static int []fact=new int[N];
 
// Function to update fact[] array
// such that fact[i] = i!
static void pre()
{
 
    // 0! = 1
    fact[0] = 1;
    for (int i = 1; i < N; i++)
    {
 
        // i! = i * (i - 1)!
        fact[i] = i * fact[i - 1];
    }
}
 
// Function to return the count
// of possible permutations
static int CountPermutation(int a[], int n)
{
 
    // To store the result
    int ways = 1;
 
    // Sort the array
    Arrays.sort(a);
 
    // Initial size of the block
    int size = 1;
    for (int i = 1; i < n; i++)
    {
 
        // Increase the size of block
        if (a[i] == a[i - 1])
        {
            size++;
        }
        else
        {
 
            // Update the result for
            // the previous block
            ways *= fact[size];
 
            // Reset the size to 1
            size = 1;
        }
    }
 
    // Update the result for
    // the last block
    ways *= fact[size];
 
    return ways;
}
 
// Driver Code
public static void main (String[] args)
{
    int a[] = { 1, 2, 4, 4, 2, 4 };
    int n = a.length;
     
    // Pre-calculating factorials
    pre();
     
    System.out.println (CountPermutation(a, n));
}
}
 
// This code is contributed by Sachin


Python3
# Python3 implementation of the approach
N = 20
 
# To store the factorials
fact = [0] * N;
 
# Function to update fact[] array
# such that fact[i] = i!
def pre() :
 
    # 0! = 1
    fact[0] = 1;
    for i in range(1, N):
 
        # i! = i * (i - 1)!
        fact[i] = i * fact[i - 1];
 
# Function to return the count
# of possible permutations
def CountPermutation(a, n):
 
    # To store the result
    ways = 1;
 
    # Sort the array
    a.sort();
 
    # Initial size of the block
    size = 1;
    for i in range(1, n):
 
        # Increase the size of block
        if (a[i] == a[i - 1]):
            size += 1;
         
        else :
 
            # Update the result for
            # the previous block
            ways *= fact[size];
 
            # Reset the size to 1
            size = 1;
 
    # Update the result for
    # the last block
    ways *= fact[size];
 
    return ways;
 
# Driver code
if __name__ == "__main__" :
 
    a = [ 1, 2, 4, 4, 2, 4 ];
    n = len(a);
 
    # Pre-calculating factorials
    pre();
 
    print(CountPermutation(a, n));
     
# This code is contributed by AnkitRai01


C#
// C# implementation of the approach
using System;
 
class GFG
{
     
static int N = 20;
 
// To store the factorials
static int []fact = new int[N];
 
// Function to update fact[] array
// such that fact[i] = i!
static void pre()
{
 
    // 0! = 1
    fact[0] = 1;
    for (int i = 1; i < N; i++)
    {
 
        // i! = i * (i - 1)!
        fact[i] = i * fact[i - 1];
    }
}
 
// Function to return the count
// of possible permutations
static int CountPermutation(int []a, int n)
{
 
    // To store the result
    int ways = 1;
 
    // Sort the array
    Array.Sort(a);
 
    // Initial size of the block
    int size = 1;
    for (int i = 1; i < n; i++)
    {
 
        // Increase the size of block
        if (a[i] == a[i - 1])
        {
            size++;
        }
        else
        {
 
            // Update the result for
            // the previous block
            ways *= fact[size];
 
            // Reset the size to 1
            size = 1;
        }
    }
 
    // Update the result for
    // the last block
    ways *= fact[size];
 
    return ways;
}
 
// Driver Code
static public void Main ()
{
    int []a = { 1, 2, 4, 4, 2, 4 };
    int n = a.Length;
     
    // Pre-calculating factorials
    pre();
     
    Console.Write(CountPermutation(a, n));
}
}
 
// This code is contributed by Sachin.


Javascript


输出:
12

时间复杂度: O(N * logN)