leetcode題庫——組合總和
阿新 • • 發佈:2018-11-11
題目描述:
給定一個無重複元素的陣列 candidates
和一個目標數 target
,找出 candidates
中所有可以使數字和為 target
的組合。
candidates
中的數字可以無限制重複被選取。
說明:
- 所有數字(包括
target
)都是正整數。 - 解集不能包含重複的組合。
示例 1:
輸入: candidates =[2,3,6,7],
target =7
, 所求解集為: [ [7], [2,2,3] ]
示例 2:
輸入: candidates = [2,3,5],
target = 8,
所求解集為:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
方法:深搜
class Solution { public: vector<vector<int>> res; vector<int> flag; int sum=0; int j=0; vector<vector<int>> combinationSum(vector<int>& candidates, int target) { if(candidates.size()==0) return res; dfs(candidates,target,j,sum); return res; } void dfs(vector<int>&candidates,int target,int j,int sum){ int i; if(sum<target){ for(i=j;i<candidates.size();i++) { flag.push_back(candidates[i]); dfs(candidates,target,i,sum+candidates[i]); flag.pop_back(); } } if(sum==target) res.push_back(flag); } };
思路:
注意:每次加的數,必須是當前這個數及其之後的數,不可以加之前的數,不然會有重複,在這裡設i=j實現。
設sum記錄當前所加數字之和,與目標數值進行比較,若sum=target,則存下來,若sum<target,則繼續加下一個數,若sum>target,則返回上一層遞迴,刪掉當前這個數,繼續加下一個數。