题目部分
216.组合总和|||
处理for循环范围时漏了等于号,然后自己改进了一点点剪枝
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
int sum = 0,startIndex=1;
traceback(k,n,sum,startIndex);
return result;
}
void traceback(int k ,int n, int sum, int startIndex){
if(sum>(n-(k-path.size())))return;
if(path.size()==k){
if(sum==n){
result.push_back(path);
}
return;
}
for(int i = startIndex;i<=9-(k-path.size())+1;i++){
path.push_back(i);
sum+=i;
traceback(k,n,sum,i+1);
sum-=i;
path.pop_back();
}
return;
}
private:
vector<vector<int>> result;
vector<int> path;
};
17.电话号码的字母组合
主要还是需要联想好回溯树,实际上和组合的题目差别不太大,一个是在单个集合内组合,一个是在两个集合内组合,index的作用变了而已
class Solution {
public:
vector<string> letterCombinations(string digits) {
result.clear();
traceback(digits,0);
return result;
}
void traceback(string digits,int Index){
if(path.size()==digits.size()){
if(path!="")result.push_back(path);
return;
}
string letter = lettermap[digits[Index]-'0'];
for(int i=0;i<letter.size();i++){
path.push_back(letter[i]);
traceback(digits,Index+1);
path.pop_back();
}
return;
}
private:
vector<string> result;
string path;
vector<string> lettermap{
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz"
};
};