【演算法 in python】全排列
阿新 • • 發佈:2018-11-07
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))