39. Combination Sum
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7]
and target 7
,
A solution set is:
[ [7], [2, 2, 3] ]
题意:
给一个数组,和一个目标值target, 求数组里一组候选数之和为target的集合 注意数组里的数可重复取值
思想:
简单的dfs回溯,遍历数组,对每个数深搜会所
C++ AC代码:
class Solution {
public:
void dfs(int n,int s,vector<int>& cur,vector<int>& candidates, vector<vector<int>>& res){
int len = candidates.size();
if(n==0)
res.push_back(cur);
if(n<0)
return ;
for(int i=s;i<len;i++){
cur.push_back(candidates[i]);
dfs(n-candidates[i],i,cur,candidates,res);
cur.erase(cur.end()-1);
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
vector<int> cur;
dfs(target,0,cur,candidates,res);
return res;
}
};
40. Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5]
and target 8
,
思想:
和39类似,不同的是,数组里的元素取值只能取一次,在dfs递归的每一层加一个判断是否与前一个元素值相等
C++ AC代码:
class Solution {
public:
void dfs(int n,int s,vector<int>& cur,vector<int>& candidates, vector<vector<int>>& res){
int len = candidates.size();
if(n==0){
res.push_back(cur);
return ;
}
if(n<0)
return ;
for(int i=s;i<len;i++){
if(i!=0&&candidates[i]==candidates[i-1]&&i>s) continue;
cur.push_back(candidates[i]);
dfs(n-candidates[i],i+1,cur,candidates,res);
cur.erase(cur.end()-1);
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
vector<vector<int>> res;
vector<int> cur;
dfs(target,0,cur,candidates,res);
return res;
}
};
216. Combination Sum III
Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Example 1:
Input: k = 3, n = 7
Output:
[[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
题意:
找到所有可能的k个数字的组合,其总和为n,因为只能使用从1到9的数字,并且每个组合应该是唯一的数字集合。
思想:
还是与39类似,不同的是元素值为1到9,设定k个数字的组合,每个组合数字不能重复取值
C++ AC代码:
class Solution {
public:
void dfs(int k,int n,int s,vector<int> cur, vector<vector<int>>& res){
if(k==0&&n==0)
res.push_back(cur);
if(k<0 ||n<0)
return ;
for(int i=s;i<=9;i++){
cur.push_back(i);
dfs(k-1,n-i,i+1,cur,res);
cur.erase(cur.end()-1);
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> res;
vector<int> curv;
dfs(k,n,1,curv,res);
return res;
}
};