全排列相關的

2022-05-18 19:12:52 字數 2058 閱讀 9610

一、給乙個列表,輸出其中元素的所有組合情況,全排列問題。例如[1,2,3],一共有6中組合情況。

def

permutation(arr,start,end):

#分割遞迴到相等的時候,說明已經遞迴到只有乙個元素的時候了,這個時候可以列印出來了

if start==end:

for val in

arr:

print(val,end='')

print(''

)

return

for i in

range(start,len(arr)):

#每次都要交換一下,誰做第乙個

arr[i],arr[start]=arr[start],arr[i]

#遞迴得到出去第乙個後面的全排列組合

permutation(arr,start+1,end)

#交換後還要再交換回來,因為下次後面的還要和第乙個交換,這樣就固定第乙個,否則來回交換就亂了

arr[i], arr[start] = arr[start], arr[i]

二、輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。

def

compare(a,b):

if str(a)+str(b)>str(b)+str(a):

return 1

elif str(a)+str(b)str(a):

return -1

else

:

return

0def

printmin(arr):

from functools import

cmp_to_key

key =cmp_to_key(compare)

tmp=[str(x) for x in sorted(arr,key=key)]

return

''.join(tmp)

基本思想:就是兩兩元素拼成乙個字串數字進行比較,把拼成最小的那種方式就是兩個元素的排序方式,例如:1,12 可以拼成112和121,顯然112<121,所以兩者的位置就是1,12。按順序排完之後,按這個順序組成的數字就是最小的數字。

三、求乙個組合函式: 如p([1,2,3]) ,輸出:[1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]

1)先寫乙個combine函式,求出c(m,n),從m中找出n個數的組合情況

def

combine(arr,m,n):

global

k

if k==0:

k=nif mor n==0:

return

for i in range(m,n-1,-1):

arr[n - 1] =i

if n-1>0:

combine(arr,i-1,n-1)

else

:

print

(arr[:k])

a=[1,2,3,4]

k=0combine(a,len(a),3)

2)列印出所有組合情況:

def

combine(arr,m,n):

global

k

if k==0:

k=nif mor n==0:

return

for i in range(m,n-1,-1):

arr[n - 1] =i

if n-1>0:

combine(arr,i-1,n-1)

else

:

print

(arr[:k])

a=[1,2,3]

for i in range(1,len(a)+1):

k=0combine(a,len(a),i)

46 全排列 全排列 遞迴

遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...

46 全排列 47 全排列II

46.全排列 這題和之前做的劍指offer上的字串全排列。一樣。分析 1 如果原始要排列的陣列順序為1 2 3 4,現在只要分別交換1 2,1 3,1 4然後對剩下的3個元素進行遞迴的排列。自己的code 100 class solution if start nums.size 1 return ...

輸出全排列(C 全排列函式)

請編寫程式輸出前n個正整數的全排列 n 10 並通過9個測試用例 即n從1到9 觀察n逐步增大時程式的執行時間。輸入格式 輸入給出正整數n 10 輸出格式 輸出1到n的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a 1,a2,an 排在序列b1,b2,bn之前,如果存在k使得...