216.组合总和III
和77的写法一样,只不过多加了一个判断条件
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void transfer(int n,int k,int start,int sum){
if(path.size()==k&&sum==n){
result.push_back(path);
return ;
}
//i <= 9 - (k - path.size()) + 1
for(int i=start;i<=9;i++){
sum+=i;
path.push_back(i);
transfer(n,k,i+1,sum);
sum-=i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
int start=1;int sum=0;
transfer(n,k,start,sum);
return result;
}
};
剪枝操作
1、sum>n 不用继续递归了
2、path中的个数超出k
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void transfer(int n,int k,int start,int sum){
if(sum>n){
return ;
}
if(k==path.size()){
if(sum==n){
result.push_back(path);return;
}
}
for(int i=start;i<=9 - (k - path.size()) + 1;i++){
sum+=i;
path.push_back(i);
transfer(n,k,i+1,sum);
sum-=i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
int start=1;int sum=0;
transfer(n,k,start,sum);
return result;
}
};
17.电话号码的字母组合
只是将数字的组合转换为数字代表的字母组合
也只是改结束条件和回溯范围
class Solution {
private:
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
public:
string path;
vector<string> result;
//start代表走到了digit的哪一个数字上
void transfer(string &digits,int start){
if(start==digits.size()){
result.push_back(path);
return;
}
int num=digits[start]-'0';
string letters=letterMap[num];
//分别遍历digit的字母
for(int i=0;i<letters.size();i++){
path.push_back(letters[i]);
//找下一个数字的字母
//transfer(digits,i+1);这代表下一个字母而不是下一个数字
transfer(digits,start+1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
result.clear();
path.clear();
if (digits.size() == 0) {
return result;
}
int start=0;
transfer(digits,start);
return result;
}
};