40 - 77
40. 组合总和 II - medium
有多个相同的元素,但要组成没有重复的组合,有两个方法做:
- 参考39题的做法,用set避免重复组合
- 参考39题的做法,但可以让同一层的数字不重复
//15.16
//15.28
//set
class Solution {
vector<vector<int>> ans;
unordered_set<string> s;
vector<int> tmp;
string str;
void helper(vector<int> &candidates, int target, int i) {
if(target == 0) {
if(s.insert(str).second)
ans.push_back(tmp);
return ;
}
if(target < 0 || i >= candidates.size() || target < candidates[i]) return ;
for(int k = i; k < candidates.size(); k++) {
tmp.push_back(candidates[k]);
str.push_back(candidates[k]+'0');
helper(candidates, target-candidates[k], k+1);
tmp.pop_back();
str.pop_back();
}
}
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
if(candidates.size() <= 0) return {};
sort(candidates.begin(), candidates.end());
helper(candidates, target, 0);
return ans;
}
};
//让处于同一层中(dfs树),没有重复的数字
class Solution {
vector<vector<int>> ans;
vector<int> tmp;
void helper(vector<int> &candidates, int target, int i) {
if(target == 0) {
ans.push_back(tmp);
return ;
}
for(int k = i; k < candidates.size(); k++) {
if(candidates[i] > target) return ;
if(k > i && candidates[k] == candidates[k-1]) continue;
tmp.push_back(candidates[k]);
helper(candidates, target-candidates[k], k+1);
tmp.pop_back();
}
}
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
if(candidates.size() <= 0) return {};
sort(candidates.begin(), candidates.end());
helper(candidates, target, 0);
return ans;
}
};
77. 组合
做法与39题类似
//16.19
//16.28
class Solution {
vector<vector<int>> ans;
vector<int> tmp;
void helper(int &n, int &k, int i, int start) {
if(i >= k) {
ans.push_back(tmp);
return ;
}
for(int j = start; j <= n; j++) {
tmp.push_back(j);
helper(n, k, i + 1, j + 1);
tmp.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
if(n < 1 || k < 1) return {};
helper(n, k, 0, 1);
return ans;
}
};