题目
给定一个无重复元素的数组 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>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
vector<int> path;
sort(candidates.begin(),candidates.end());
DFS(res,candidates,path,0,target);
return res;
}
void DFS(vector<vector<int>> &res,vector<int> can,vector<int> path,int begin,int target){
//如果满足条件,就把它放进结果里面
if(target == 0 ){
res.push_back(path);
return;
}
for (int i = begin;i < can.size() && target - can[i] >= 0; i++) {
//试探性放进去一个,再递归回溯
path.push_back(can[i]);
DFS(res,can,path,i, target - can[i]);
//把该结果取回,尝试下一个
path.pop_back();
}
}
};
网友评论