leetcode 演算法 組合總和 III 216

2021-09-23 17:25:10 字數 960 閱讀 8207

leetcode 傳送門

找出所有相加之和為 n 的 k 個數的組合。組合中只允許含有 1 - 9 的正整數,並且每種組合中不存在重複的數字。

說明:

所有數字都是正整數。

解集不能包含重複的組合。

示例 1:

輸入: k = 3, n = 7

輸出: [[1,2,4]]

示例 2:

輸入: k = 3, n = 9

輸出: [[1,2,6], [1,3,5], [2,3,4]]

首先,我們很容易有這樣乙個想法,構造一棵樹,根節點為0,子節點為1到,然後每個子節點的子節點都是1-9,我們只需要累加子節點以及子孫節點的值,然後判斷其和是否等於目標值n並且深度等於k即可得出所有組合。這是最簡單的思想,雖然問題很多。但是提供了乙個開始的思路,接下來只需要優化這個演算法就行了。

首先這題要求組合不能重複,於是,我們可以再加乙個要求,從深度為2的節點開始,子節點的個數為9-父節點值,值分別為父節點值到9,這樣就可以保證從根到葉子不存在重複的路徑。

接下來,我們只需要在這棵樹中尋找我們需要的從深度為1的節點到葉子節點的路徑即可,這題很明顯我們應該使用深度優先遍歷,

然後依次遍歷子節點,子節點的子節點,用乙個變數累加其和,如果深度等於k而且和正好為n,則新增到解空間中。如果深度大於k,或者和大於n,則回溯即可。

class

solution

public

static

void

find

(list

> listall, list

tmp,

int target,

int num,

int k)

// 遍歷

for(

int i = num; i <

10&& i <= target; i++)}

}

leetcode演算法題 組合總和

1 遞迴 一開始用遞迴做,寫完就就對了,不過超時了,其實我沒有很懂為何遞迴不會出現重複。int combinationsum4 vector int nums,int target return count 2 動態規劃 於是用動態規劃 int combinationsum4 vector int ...

LeetCode 組合總和

給定乙個由正整數組成且不存在重複數字的陣列,找出和為給定目標正整數的組合的個數。示例 nums 1,2,3 target 4 所有可能的組合為 1,1,1,1 1,1,2 1,2,1 1,3 2,1,1 2,2 3,1 請注意,順序不同的序列被視作不同的組合。因此輸出為 7。高階 如果給定的陣列中含...

LeetCode組合總和

39.給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 所有數字 包括 target 都是正整數。解集不能包含重複的組合。解法 static l...