代码随想录算法训练营第二十八天
216.组合总和III
题目链接:216.组合总和III
class Solution {
public:
vector<int> result;
vector<vector<int>> results;
void backtracking(int k,int startIndex,int &sum,int targetSum){
if (sum>targetSum)return;//加和大于目标和就可以提前跳出递归了
if(result.size()==k&&sum ==targetSum){//将符合条件的集合加入结果集内,跳出
results.push_back(result);
return;
}
for(int i = startIndex;i<=9-(k-result.size())+1;i++){//剪枝
sum+=i;//加和
result.push_back(i);//收集元素
backtracking(k, i+1, sum, targetSum);//递归
result.pop_back();//回溯
sum-=i;
}
}
vector<vector<int>> combinationSum3(int k, int n) {
int sum = 0;
backtracking(k, 1, sum, n);
return results;
}
};
17.电话号码的字母组合
题目链接:17.电话号码的字母组合
class Solution {
public:
string S;//收集单个结果
vector<string> result;//结果集
const char* digit_map[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
void backtracking(string digits,int index){
if(S.size()==digits.size()){
result.push_back(S);
return;
}
int digit = digits[index]-'0';//将字符串转换成索引
string letter = digit_map[digit];
for(int i =0;i<letter.size();i++){
S.push_back(letter[i]);//取字符加入单个结果
backtracking(digits, index+1);//递归,取下一个索引内的结果
S.pop_back();//回溯
}
}
vector<string> letterCombinations(string digits) {
if(digits.size()==0){//额外判断空字符串
return result;
}
backtracking(digits, 0);
return result;
}
};