給定乙個由正整數組成且不存在重複數字的陣列,找出和為給定目標正整數的組合的個數。
示例:
nums = [1, 2, 3] t答案:arget = 4
所有可能的組合為:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
請注意,順序不同的序列被視作不同的組合。
因此輸出為 7。
public
intcombinationsum4
(int
nums,
int target)
, count)
;return count[0]
;}private
void
helper
(int
nums,
int[
] target,
int[
] count)
if(target[0]
>0)
for(
int i =
0; i < nums.length; i++
)}
解析:這種是遞迴加回溯的方式,前面也講過很多這種類似的題的,也很容易理解,但這種遞迴效率實在是很差,我們還可以在改進一下,減少重複計算
public
intcombinationsum4
(int
nums,
int target)
private
inthelper
(int
nums,
int target, map
map)
return res;
}
即便是這樣,但因為遞迴的使用,導致執行效率還不是很高,我們可以考慮一下動態規劃的使用
public
intcombinationsum4
(int
nums,
int target)}}
return dp[target]
;}
這個非常類似於揹包問題,但揹包問題有數量上的限制,而這道題沒有。我們還以上面舉的例子,畫個圖來加深一下理解,我們可以把它當成一棵樹,每個節點最多有nums.length個子節點。
我們看到樹中有大量的子樹重複,上面**是按照從樹的底往上進行計算的,如果想要從上往下計算我們就要使用遞迴的方式了,也就是前面兩種解法的答案。
349,組合總和
給定乙個由正整數組成且不存在重複數字的陣列,找出和為給定目標正整數的組合的個數。示例 nums 1,2,3 t arget 4 所有可能的組合為 1,1,1,1 1,1,2 1,2,1 1,3 2,1,1 2,2 3,1 請注意,順序不同的序列被視作不同的組合。因此輸出為 7。答案 public i...
39 組合總和
給定乙個無重複元素的陣列 candidates 和乙個目標數 target 找出 candidates 中所有可以使數字和為 target 的組合。candidates 中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2...
39 組合總和
給定乙個無重複元素的陣列candidates和乙個目標數target,找出candidates中所有可以使數字和為target的組合。candidates中的數字可以無限制重複被選取。說明 示例 1 輸入 candidates 2,3,6,7 target 7,所求解集為 7 2,2,3 示例 2 ...