题目概述
- 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
- candidates 中的数字可以无限制重复被选取。
- 原题链接
例如:
输入:candidates = [2,3,6,7], target = 7
输出:[ [7], [2,2,3] ]
难度级别:Medium
思考过程
- 首先想的是用两层for循环,计算从i开始到结尾所有满足条件的解法。问题在于不能进行跳选。
- 思考很久发现对这类题不太了解,故查看题解,发现:对于这类寻找所有可行解的题,我们都可以尝试用「搜索回溯」的方法来解决。
- 参考一:回溯算法 + 剪枝(回溯经典例题详解)
- 参考二:39. 组合求解(C++解典型的回溯题目)
代码实现
class Solution {
public:
void dfs(vector<int>& candidates, int target, int cur, vector<int>& tmp, vector<vector<int>>& res){
if (target < 0) return ;
if (target == 0){
res.push_back(tmp);
return ;
}
for (int i = cur; i < candidates.size(); i++){
tmp.push_back(candidates[i]);
dfs(candidates, target - candidates[i], i, tmp, res);
tmp.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
vector<int> tmp;
dfs(candidates, target, 0, tmp, res);
return res;
}
};