【算法】全排列

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章