找出m個總和為n的數字

2021-04-17 04:33:42 字數 663 閱讀 8185

上周末公司組織去旅遊,在路上乙個同事提出了乙個小問題,就是怎麼找出三個數,使它們的和為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

:print

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...