给定一个不同整数A的数组,任务是计算给定数组A []的可能排列的数量,以使该排列不包含原始数组中任何大小为2或更大的子数组。
例子:
Input: A = [ 1, 3, 9 ]
Output: 3
All the permutation of [ 1, 3, 9 ] are : [ 1, 3, 9 ], [ 1, 9, 3 ], [ 3, 9, 1 ], [ 3, 1, 9 ], [ 9, 1, 3 ], [ 9, 3, 1 ]
Here [ 1, 3, 9 ], [ 9, 1, 3 ] are removed as they contain sub-array [ 1, 3 ] from original list
and [ 3, 9, 1 ] removed as it contains sub-array [3, 9] from original list so,
Following are the 3 arrays that satisfy the condition : [1, 9, 3], [3, 1, 9], [9, 3, 1]
Input : A = [1, 3, 9, 12]
Output :11
天真的方法:遍历所有排列的列表,并从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。