给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum
示例 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]
]
https://github.com/soulmachine/leetcode
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
vector<vector<int>> result;
vector<int> intermediate;
dfs(candidates,target,0,intermediate,result);
return result;
}
private:
void dfs(vector<int>& nums,int gap,int start,vector<int>& intermediate,vector<vector<int>> &result){
if(gap==0){ // 找到一个合法解
result.push_back(intermediate);
return;
}
for(size_t i=start;i<nums.size();i++){ // 扩展状态
if(gap<nums[i]) return; //剪枝
intermediate.push_back(nums[i]); // 执行扩展动作
//从i继续可以避免重复
dfs(nums,gap-nums[i],i,intermediate,result);
// 不论目前组合是否合法,都应该在返回时撤销
intermediate.pop_back(); // 撤销动作
}
}
};
执行用时 | 内存消耗 |
---|---|
8 ms | 9.9 MB |
https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/
没啥区别,变量少点。
// author:rmokerone
#include
#include
using namespace std;
class Solution {
private:
vector<int> candidates;
vector<vector<int>> res;
vector<int> path;
public:
void DFS(int start, int target) {
if (target == 0) {
res.push_back(path);
return;
}
for (int i = start;
i < candidates.size() && target - candidates[i] >= 0; i++) {
path.push_back(candidates[i]);
DFS(i, target - candidates[i]);
path.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int> &candidates, int target) {
std::sort(candidates.begin(), candidates.end());
this->candidates = candidates;
DFS(0, target);
return res;
}
};
size_t 这个类型的意义是什么?
vector删除元素之pop_back(),erase(),remove()