給定一個無重複元素的數組 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]
]
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/combination-sum
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
思路分析
每一個位置的數在選擇的時候有兩種可能,選或不選,深度遍歷即可。
代碼分析
class Solution {
vector<vector<int>> new_candidates;
vector<int> temp;
int sum;
void dfs(vector<int>& candidates,int pos,int target){
if(sum == target){
new_candidates.push_back(temp);
return ;
}
if(sum > target)
return ;
if(pos >= candidates.size())
return ;
temp.push_back(candidates[pos]);
sum += candidates[pos];
dfs(candidates,pos,target);//繼續遍歷同一個數,選同一個數
temp.pop_back();
sum -= candidates[pos];
dfs(candidates,pos + 1,target);//遍歷下一個數,選下一個數
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sum = 0;
dfs(candidates,0,target);
return new_candidates;
}
};