目录
组合总和
题目出处:https://leetcode-cn.com/problems/combination-sum/
思路:递归
代码1:
class Solution {
private:
vector<vector<int>> ans;
public:
void dfs(int index, vector<int>& candidates, int& target, vector<int>& path, int count){
if(count == target){
ans.emplace_back(path);
return;
}
if(count > target){
return;
}
for(int i = index; i < candidates.size(); ++i){
path.push_back(candidates[i]);
dfs(i, candidates, target, path, count+candidates[i]);
path.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<int> path;
int count = 0;
for(int i = 0; i < candidates.size(); ++i){
count = candidates[i];
path.push_back(candidates[i]);
dfs(i, candidates, target, path, count);
path.pop_back();
}
return ans;
}
};
代码2:
class Solution {
private:
vector<vector<int>> ans;
public:
void dfs(int index, vector<int>& candidates, int& target, vector<int>& path, int count){
if(count == target){
ans.emplace_back(path);
return;
}
if(count > target){
return;
}
for(int i = index; i < candidates.size(); ++i){
path.push_back(candidates[i]);
dfs(i, candidates, target, path, count+candidates[i]);
path.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<int> path;
int count = 0;
dfs(0, candidates, target, path, count);
return ans;
}
};
组合总和2
题目出处:https://leetcode-cn.com/problems/combination-sum-ii/
思路:排序+递归去重
class Solution {
private:
vector<bool> vis;
vector<vector<int>> ans;
public:
void dfs(int index, vector<int>& candidates, int& target, vector<int>& path, int count){
if(count == target){
ans.emplace_back(path);
return;
}
if(count > target){
return;
}
for(int i = index; i < candidates.size(); ++i){
if(i >= 1 && candidates[i] == candidates[i-1] && !vis[i-1]){
continue;
}
path.push_back(candidates[i]);
vis[i] = true;
dfs(i+1, candidates, target, path, count+candidates[i]);
vis[i] = false;
path.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<int> path;
vis.resize(candidates.size(), false);
sort(candidates.begin(), candidates.end());
int count = 0;
dfs(0, candidates, target, path, count);
return ans;
}
};
组合总和3
题目出处:https://leetcode-cn.com/problems/combination-sum-iii/
方法一
思路:dfs+path长度限制
class Solution {
private:
vector<vector<int>> ans;
public:
void dfs(int index, int &n, vector<int>& path, int count, vector<int>& data, int &k){
if(count == n && path.size() == k){
ans.push_back(path);
return;
}
if(count > n){
return;
}
for(int i = index; i < data.size(); ++i){
path.push_back(data[i]);
dfs(i+1, n, path, count+data[i], data, k);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<int> path;
int count = 0;
vector<int> data({1,2,3,4,5,6,7,8,9});
dfs(0, n, path, count, data, k);
return ans;
}
};
方法二
思路:dfs+减枝
class Solution {
private:
vector<vector<int>> ans;
public:
void dfs(int index, int &n, vector<int>& path, int count, vector<int>& data, int &k){
if(count == n && path.size() == k){
ans.push_back(path);
return;
}
if(path.size() > k){
return;
}
if(count > n){
return;
}
for(int i = index; i < data.size(); ++i){
path.push_back(data[i]);
dfs(i+1, n, path, count+data[i], data, k);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<int> path;
int count = 0;
vector<int> data({1,2,3,4,5,6,7,8,9});
dfs(0, n, path, count, data, k);
return ans;
}
};
组合总和4
思路:动态规划
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target + 1);
dp[0] = 1;
for (int i = 1; i <= target; i++) {
for (int& num : nums) {
if (num <= i && dp[i - num] < INT_MAX - dp[i]) {
dp[i] += dp[i - num];
}
}
}
return dp[target];
}
};