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