题目描述:
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
题目来源:LeetCode(77. 组合)
解决代码:
class Solution {
public:
vector<vector<int> > res;
vector<vector<int>> combine(int n, int k) {
if(n < 1 || n < k)
return res;
vector<int> tmp;
func(n,k,1,tmp);
return res;
}
void func(int n,int k,int pos,vector<int> &tmp)
{
if(k == 0)
{
res.push_back(tmp);
return;
}
for(int i = pos;i<=n-k+1;i++)
{
tmp.push_back(i);
func(n,k-1,i+1,tmp);
tmp.pop_back();
}
}
};
题目描述:
给定一个数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用一次。
题目来源:LeetCode(40. 组合总和 II)
解决代码:
class Solution {
public:
set<vector<int> > res;
vector<int> vec;
void func(vector<int> &nums,int target,int pos)
{
if(target < 0)
return;
if(target == 0)
{
sort(vec.begin(),vec.end());
res.insert(vec);
}
if(pos == nums.size())
{
return;
}
for(int i = pos;i<nums.size();i++)
{
vec.push_back(nums[i]);
func(nums,target-nums[i],i+1);
vec.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
func(candidates,target,0);
vector<vector<int> > result;
set<vector<int> >::iterator it;
for(it = res.begin();it!=res.end();it++)
{
result.push_back(*it);
}
return result;
}
};
题目描述:
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
- 所有数字都是正整数。
- 解集不能包含重复的组合。
题目来源:LeetCode(216. 组合总和 III)
解决代码:
class Solution {
public:
vector<vector<int> > res;
vector<int> tmp;
vector<vector<int>> combinationSum3(int k, int n) {
func(k,n,1);
return res;
}
void func(int k,int n,int pos)
{
if(tmp.size() == k && n == 0)
{
res.push_back(tmp);
return;
}
if(n < 1 || tmp.size() == k)
return;
for(int i = pos;i <= 9;i++)
{
tmp.push_back(i);
func(k,n-i,i+1);
tmp.pop_back();
}
}
};
题目描述:
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。
题目来源:LeetCode(377. 组合总和 Ⅳ)
解决代码:
使用了动态规划,跟其他求组合的方法不同
class Solution {
public:
vector<vector<int> > res;
vector<int> tmp;
int combinationSum4(vector<int>& nums, int target) {
if(nums.size() == 0)
return 0;
vector<int> tmp(target+1,0);
tmp[0] = 1;
sort(nums.begin(),nums.end());
for(int i = 1;i<=target;i++)
{
for(int j = 0;j<nums.size();j++)
{
if(nums[j] <= i)
tmp[i] = tmp[i] + tmp[i-nums[j]];
}
}
return tmp[target];
}
};