目录索引
组合系列链接
组合一、组合二以及组合三
三题的详细题解链接里面很多,不懂就过去看
组合一
题目:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
这个题用回溯解决,所以就有了模板,直接上代码。
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void bfs(int n,int k,int startIndex){
if(path.size()==k){
//终止条件
result.push_back(path);
return ;
}
for(int i=startIndex; i<=n; i++){
path.push_back(i);
bfs(n,k,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
bfs(n,k,1);
return result;
}
};
组合二
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
新增条件candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
这个题也是回溯,模板继续套用,但是多了一些剪枝条件
class Solution {
public:
void dfs(vector<int> candidates,int target,int rus,vector<vector<int>>& x,vector<int>& y)
{
if(target<0)return;
if(target==0){
x.push_back(y);
return ;
}
for(int i=rus;i<candidates.size();i++)
{
if(i>rus && candidates[i]==candidates[i-1])
continue;//剪枝:去掉【1,2,5】和【1,2,5】重复出现的问题
y.push_back(candidates[i]);
dfs(candidates,target-candidates[i],i+1,x,y);//保证数据不会重复取用
y.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> x;
vector<int> y;
sort(candidates.begin(),candidates.end());
dfs(candidates,target,0,x,y);
return x;
}
};
组合三
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
扫描二维码关注公众号,回复:
12160023 查看本文章
这个依然是回溯,大的模板一致,也就是参数的变化和一些剪枝
class Solution {
public:
void dfs(int k,int n,int pos,vector<vector<int>>& result,vector<int>& path)
{
if(n<0 || k<0) return ;
if(n==0 && k==0)
{
result.push_back(path);
return ;
}
for(int i=pos;i<10;i++)
{
//if()continue;
path.push_back(i);
dfs(k-1,n-i,pos+1,result,path);
pos++;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> result;
vector<int> path;
dfs(k,n,1,result,path);
return result;
}
};
笔记比较简略,不懂就回去看题解