一、給乙個列表,輸出其中元素的所有組合情況,全排列問題。例如[1,2,3],一共有6中組合情況。
defpermutation(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。
defcompare(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個數的組合情況
defcombine(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
:
(arr[:k])
a=[1,2,3,4]
k=0combine(a,len(a),3)
2)列印出所有組合情況:
defcombine(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
:
(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使得...