【算法 in python】全排列

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))
    

猜你喜欢

转载自blog.csdn.net/u013166817/article/details/83744872