上周末公司組織去旅遊,在路上乙個同事提出了乙個小問題,就是怎麼找出三個數,使它們的和為13。後來又引申為如何找出m個數,使它們的和為n。下面是使用遞迴的方法來實現:
import
sysdef
test( nblock, ntotal, nbegin=1
):if
nblock
<=1:
return
[[ntotal]]a =
fori
inrange(nbegin, ntotal
/nblock+1
):a.extend( [k
+[i]
fork
intest(nblock-1
, ntotal
-i, i)] )
returnaif
__name__=='
__main__':
iflen(sys.argv) ==3
test(int(sys.argv[
1]), int(sys.argv[
2]))
其中nblock為個數,ntotal為總和,nbegin為所需要找的nblock個數的數字的下限值。
基本思路:先確定第乙個數為a,然後再找出nblock-1個數使它們的和為ntotal-a.
n個數字取m個的組合數
對於這個問題有兩種版本,n個元素互不相同,n個元素有重複。有重複用集合之類的方法去重即可。因此我們解決簡單版本假設n個元素互不相同。emmm 其實應該是同一種方法,第一種回朔法用了系統的棧空間,第二種用了自己建立的棧空間。相比較而言第二種演算法的空間複雜度會低一些,因為借助系統的棧會儲存好多多餘的資...
從 n個長度的序列中找出前 m大個元素
方法一 利用優先佇列的特性 堆序 在構建出 max堆 大頂堆 之後,不斷將堆頂的元素移除,就能很輕鬆的獲取前 m個最大的元素.方法二 對第一種方法的優化,維護乙個含有 m個元素的序列,在對原始數列進行掃瞄,動態調整目標序列,一次掃瞄結束之後,前 m個元素也就找到了.public class sort...
m個珠子共n種顏色,找出包含n種顏色的最短連續片段
原題目 題目分析 一 暴力搜尋 1 最簡單的方法 暴力搜尋,逐個掃瞄第i個位置開始包含n中顏色最短區間,時間複雜度為o m 2 2 從i開始掃瞄,每出現一種新的顏色,計數 1 當計數 n時候,結束,此時即為i開始的最短區間 二 1 掃瞄一遍陣列m,計算出每種顏色在陣列m中下一次出現的位置,存在資料n...