📌  相关文章
📜  不包含大小为2或更大的SubArray的Array与原始Array的排列次数

📅  最后修改于: 2021-04-23 07:57:46             🧑  作者: Mango

给定一个不同整数A的数组,任务是计算给定数组A []的可能排列的数量,以使该排列不包含原始数组中任何大小为2或更大的子数组。

例子:

天真的方法:遍历所有排列的列表,并从A中删除包含任何子数组[i,i + 1]的那些数组。

下面是上述方法的实现:

# Python implementation of the approach
  
# Importing the itertools 
from itertools import permutations
  
# Function that return count of all the permutation
# having no sub-array of [ i, i + 1 ]
def count(arr):
    z =[]
    perm = permutations(arr)
    for i in list(perm):
        z.append(list(i))
  
    q =[]
    for i in range(len(arr)-1):
        x, y = arr[i], arr[i + 1]
        for j in range(len(z)):
  
            # Finding the indexes where x is present
            if z[j].index(x)!= len(z[j])-1:
  
                # If y is present at position of x + 1
                # append into a temp list q
                if z[j][z[j].index(x)+1]== y:
                    q.append(z[j])
  
    # Removing all the lists that are present
    # in z ( list of all premutations )
    for i in range(len(q)):
         if q[i] in z:
             z.remove(q[i])
    return len(z)
  
# Driver Code
A =[1, 3, 9]
print(count(A))
输出:
3

高效的解决方案:在为较小尺寸的数组制作解决方案之后,我们可以观察到一个模式:

以下模式会产生重复发生:
假设数组A的长度为n,则:

count(0) = 1
count(1) = 1
count(n) = n * count(n-1) + (n-1) * count(n-2)

下面是该方法的实现:

C++
// C++ implementation of the approach 
#include
using namespace std;
  
// Recursive function that returns 
// the count of permutation-based 
// on the length of the array. 
int count(int n)
{ 
    if(n == 0)
        return 1;
    if(n == 1)
        return 1;
    else
        return (n * count(n - 1)) + 
              ((n - 1) * count(n - 2));
}
  
// Driver Code
int main()
{
    int A[] = {1, 2, 3, 9};
      
    // length of array
    int n = 4;
          
    // Output required answer
    cout << count(n - 1); 
          
    return 0;
}
  
// This code is contributed by Sanjit Prasad


Java
// Java implementation of the approach 
import java.util.*;
  
class GFG
{
  
// Recursive function that returns 
// the count of permutation-based 
// on the length of the array. 
static int count(int n)
{ 
    if(n == 0)
        return 1;
    if(n == 1)
        return 1;
    else
        return (n * count(n - 1)) + 
              ((n - 1) * count(n - 2));
}
  
// Driver Code
public static void main(String[] args)
{
    int A[] = {1, 2, 3, 9};
      
    // length of array
    int n = 4;
          
    // Output required answer
    System.out.println(count(n - 1)); 
}
} 
  
// This code is contributed by PrinciRaj1992


Python3
# Python implementation of the approach
  
# Recursive function that returns
# the count of permutation-based
# on the length of the array.
  
def count(n):
    if n == 0:
        return 1
    if n == 1:
        return 1
    else:
        return (n * count(n-1)) + ((n-1) * count(n-2))
  
# Driver Code
A =[1, 2, 3, 9]
print(count(len(A)-1))


C#
// C# implementation of the above approach
using System;
  
class GFG
{
  
// Recursive function that returns 
// the count of permutation-based 
// on the length of the array. 
static int count(int n)
{ 
    if(n == 0)
        return 1;
    if(n == 1)
        return 1;
    else
        return (n * count(n - 1)) + 
              ((n - 1) * count(n - 2));
}
  
// Driver Code
public static void Main(String[] args)
{
    int []A = {1, 2, 3, 9};
      
    // length of array
    int n = 4;
          
    // Output required answer
    Console.WriteLine(count(n - 1)); 
}
}
  
// This code is contributed by PrinciRaj1992


输出:
11

注意:对于上述重复出现,您可以检查oeis.org。