對於這個問題有兩種版本,n個元素互不相同,n個元素有重複。有重複用集合之類的方法去重即可。
因此我們解決簡單版本假設n個元素互不相同。
emmm: 其實應該是同一種方法,第一種回朔法用了系統的棧空間,第二種用了自己建立的棧空間。相比較而言第二種演算法的空間複雜度會低一些,因為借助系統的棧會儲存好多多餘的資料。
廢話不多說,看**:
# coding: utf-8
def combination(arr, m):
s =
temp =
n = len(arr)
i = 0
while i < n:
if len(temp) < m:
if i < n-1:
i += 1
elif 1 < len(temp) < m: # i = n-1對於邊界情況需要特殊處理
temp.pop()
i = temp.pop()
i += 1
elif len(temp) == m:
continue
else:
break
else:
i = temp.pop()
print(s)
if i < n-1:
i += 1
elif len(temp) > 0: #對於邊界情況特殊處理
i = temp.pop()
i += 1
else: #主要針對m=1的特殊情況
break
return s
a = [4, 5, 6, 7]
print(combination(a, 1))
m個數取n個進行組合 C m n
m個數取n個進行組合 10反轉置換法 演算法思想 1 初始化乙個m個元素的陣列 全部由0,1組成 將前n個初始化為1,後面的為0。這時候就可以輸出第乙個組合序列了。2 從前往後找,找到第乙個10組合,將其反轉成01,然後將這個10組合前面的所有1,全部往左邊推 即保證其前面的1都在最左邊。這時又可以...
C 排列組合 N個數中取M個數
感謝一位好朋友和我分享了這樣的乙份 因為自己當時考慮的遞迴演算法相當糾結,怎樣遞迴都不大對,然後我的好朋友和我分享了一段這樣的 我現在分享給大家。題目 在n個數中取m個數,用的方法使用的是開闢乙個長度為100的int型陣列,0 1 2 99 100 比如說測試資料為 4 2 也就是從1 4中取2個數...
n全排列輸出和 n個數的組合 數字範圍a b
n全排列輸出 int wpermutation int num,bool brepeat num表示num全排列 brepeat標誌是否產生重複元素的序列。int permutation int n,int a,int cur,bool brepeat printf n else if ok ret...