城乡建设局网站首页,兰州网站开发公司,重庆专业网站建设,手机更新wordpress文章目录问题描述解题报告实现代码参考资料问题描述
给定一个无重读元素的数组 candidates 和一个目标数 target,找出 candidates中所有可以使数字和为target 的组合。 candidates 中的数字可以无限制重复被选取。 说明:
所有数字(包括 tar…
文章目录
- 问题描述
- 解题报告
- 实现代码
- 参考资料
问题描述
给定一个无重读元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。 - 解集不能包含重复的组合。
输入: candidates = [2,3,6,7], target = 7,
所求解集为:[[7], [2,2,3]]
解题报告
由于每个数字可以被重复使用,而且一个子集中的元素是无序的,所以我们可以认为定义每个子集都是非单调递减的或者非单调递增的,这样,就不会出现[2,2,3]和[2,3,2]这样的答案了。
实现代码
class Solution {
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>>ans;vector<int>cur;sort(candidates.begin(), candidates.end());dfs(ans, candidates, target, target, cur);return ans;}void dfs(vector<vector<int>>&ans, vector<int>& candidates, int target, int left, vector<int>cur){if(left==0) ans.push_back(cur);else{for(int i=0;i<candidates.size();i++){if(candidates[i]>left)break;else if(cur.size()==0||candidates[i]>=cur.back()){cur.push_back(candidates[i]);dfs(ans, candidates, target, left-candidates[i], cur);cur.pop_back();}}}}
};
参考资料
[1] Leetcode. 组合总和