【算法/回溯算法/组合问题】题解+详细备注(共5题)
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void recursive(int n,int k,int startIndex){
if(path.size() == k){
result.push_back(path);
return;
}
for(int i = startIndex;i<=(n - (k-path.size()) + 1);++i){
path.emplace_back(i);
recursive(n,k,i+1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
recursive(n,k,1);
return result;
}
};
class Solution {
public:
vector<string> result;
string path;
vector<string> container{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void backtracking(string &digits,int startIndex){
if(path.size() == digits.size()){
result.push_back(path);
return;
}
for(int i = 0;i<container[digits[startIndex] - '0'].size();++i){
path.push_back(container[digits[startIndex]-'0'][i]);
backtracking(digits,startIndex+1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.empty()) return {};
backtracking(digits,0);
return result;
}
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target,int startIndex,int sum){
if(sum > target){
return;
}
if(sum == target){
result.push_back(path);
return;
}
for(int i = startIndex;i<candidates.size();++i){
path.push_back(candidates[i]);
sum+=candidates[i];
backtracking(candidates,target,i,sum);
path.pop_back();
sum-=candidates[i];
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
backtracking(candidates,target,0,0);
return result;
}
};
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) {
if (sum == target) {
result.push_back(path);
return;
}
for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
continue;
}
sum += candidates[i];
path.push_back(candidates[i]);
used[i] = true;
backtracking(candidates, target, sum, i + 1, used);
used[i] = false;
sum -= candidates[i];
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<bool> used(candidates.size(), false);
path.clear();
result.clear();
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, 0, used);
return result;
}
};
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(int k,int n,int sum,int startIndex){
if(sum > n) return;
if(path.size() == k){
if(sum == n)result.push_back(path);
return;
}
for(int i = startIndex;i<=9-(k-path.size()) +1;++i){
sum+=i;
path.emplace_back(i);
backtracking(k,n,sum,i+1);
sum-=i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k,n,0,1);
return result;
}
};