1.全排列
给定一个没有重复数字的序列,返回其所有可能的全排列
#递归,取一个数放在第一个位置,然后求剩下数据的全排列,以此类推
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if len(nums) <= 1:
return [nums]
res = []
for i,num in enumerate(nums):
temp = nums[:i]+nums[i+1:]
for nums2 in self.permute(temp):
res.append([num]+nums2)
return res
2. 数列还原
长度为n的数列,包含数字1~n,其中一部分不可见,已知整个数列的顺序对数是k(顺序对数:i<j, and a[i]<a[j]). 求不可见部分的可能排列种类数。
def fun(data,n,k):
#找出遗失数据对应的index,并存到数组index里
index = []
for i in range(n):
if data[i] == 0:
index.append(i)
#找出遗失的数据
lost = []
for i in range(1,n+1):
if not(i in data):
lost.append(i)
#对遗失数据全排列,将每个全排列的数列插入到原数列,计算顺序对数,若=k,则结果加1
res = 0
perms = permute(lost)
for perm in perms:
for i in range(len(perm)):
data[index[i]] = perm[i]
if pair(data) == k:
res += 1
return res
#计算全排列结果
def permute(lost):
if len(lost) <= 1:
return [lost]
res = []
for i, num in enumerate(lost):
temp = lost[:i]+lost[i+1:]
for lost2 in permute(temp):
res.append([num] + lost2)
return res
#计算给定数列的顺序对数
def pair(data):
num = 0
for i in range(len(data)):
for j in range(i, len(data)):
if data[i] < data[j]:
num += 1
return num
n,k = map(int, input().split())
data = [int(i) for i in input().split()]
print(fun(data,n,k))