class
solution:
defpermutation
(self, ss):
ifnot ss:
return
if len(ss) == 1:
return [ss]
l_ss = list(ss)
l_ss.sort() # 按字典的順序進行排序
res = # 返回的所有組合
for i in range(len(ss)): # 迴圈一次,相當於交換第乙個元素一次
if i > 0
and l_ss[i] == l_ss[i-1]: # 存在相鄰的多個元素重複時
continue
temps = self.permutation(''.join(l_ss[:i]) + ''.join(l_ss[i+1:])) # 遞迴除去i的其他組合
for j in temps:
return res
排列組合問題求解關於該排列組合的問題的拓展形式有很多,例如下面這種:
**實現如下:
def
groupall
(ss):
ifnot ss:
return
if len(ss) == 1:
return [ss]
l_ss = list(ss)
l_ss.sort()
res =
for i in range(len(ss)):
if i > 0
and l_ss[i] == l_ss[i-1]:
continue
temps = groupall(''.join(l_ss[i+1:])) # 只對i後面的進行遞迴
for j in temps:
res = list(set(res)) # 去除重複的
res.sort()
return res
上面的**是針對字串的,稍做簡單的修改就可以實現對數字的排列組合。見**:
def
group_array
(self, array):
ifnot array:
return
if len(array) == 1:
return [array]
res =
for i in range(len(array)):
if i > 0
and array[i] == array[i - 1]:
continue
temps = group_array(array[0:i] + array[i+1:])
for j in temps:
return res
n後問題的最主要的工作就剩下判斷是否是在對角線上。這個很簡單,給陣列設定兩個指標i, j,如果i-j==array[i]-array[j]或者j-i==array[i]-array[j],說明在對角線上。
def
n_queen
(columns):
res = group_array(columns) # 全排列
count = 0
for column in res:
check = true
# 判斷是否滿足條件
for i in range(len(column)):
for j in range(i + 1, len(column)):
if i - j == column[i] - column[j] or i - j == column[j] - column[i]:
check = false
if check: # 滿足條件
count += 1
print(len(res))
return count
執行上述**,會發現對於n=8的時候,共有40320種組合。其中,滿足要求的,即n=8的皇后問題的解共有92個。 排列組合問題
若有一串字母abc,進行全排列,有六種方法,3的階層,321,為什麼是這樣呢,我們根據 看思路 這之間會涉及遞迴,回溯 將abc看成陣列,a 0 a,a 1 b,a 2 c 下文中用a0代替a,a1代替b,a2代替c 排列的過程就是交換位置的過程 1 先對a進行交換 即k 0時 a0和a0自己交換 ...
排列組合問題
基本的排列組合問題,就是高中數學的內容,怎麼用程式語言輸出所有排列呢?我們手寫的過程,它應該是乙個遞迴的過程,而不適合用for wihle迴圈。如果資料結構學的紮實,可以發現這是乙個樹結構,遍歷所有的葉子節點就能夠得到全排列。說到遞迴,應該向大家隆重介紹一下數學歸納法的思想,應為都有乙個問題規模n。...
排列組合問題
這資料寫個暴力都拿不了30分 t t。c n,i c n,i c n,i c n,n i 結合現實意義,在n個裡面選 i 個,再在n個裡面選n i個的方案數。就等價於在前n個中選 i 個,在後n各種選n i個。而且i 0 n 在2 n各種選n個。那麼 c 2 n,n 答案要對1000000007取模...