class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>>result;
vector<int>path;
bt(result,path,1,n,k);
return result;
}
void bt(vector<vector<int>>& result, vector<int>& path, int l, int n, int k){
if(k==0){
result.push_back(path);
return;
}
while(l<=(n-k+1)){
path.push_back(l);
bt(result,path,++l,n,k-1);
path.pop_back();
}
}
};
就按照随想录给的回溯模板修改。
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>>result;
vector<int>path;
bt(result,path,1,k,n);
return result;
}
void bt(vector<vector<int>>& result, vector<int>& path, int l, int k, int n){
if((k==0&&n!=0)) return;
if(k==0&&n==0){
result.push_back(path);
return;
}
for(int i=l;i<10;i++){
cout<<i<<" "<<k-1<<n-i<<"\n";
path.push_back(i);
bt(result,path,i+1,k-1,n-i);
path.pop_back();
}
}
};
这题就是在上题求组合的基础上增加求和判断,其实还可以更进一步进行剪枝,比如在循环开始前,根据等差数列和的性质判断是否还有继续遍历的必要。
class Solution {
public:
vector<string> letterCombinations(string digits) {
if(digits.size()==0) return {};
vector<string>result;
bt(result,digits,"",0);
return result;
}
void bt(vector<string>& result, string& digits, string s, int len){
if(len==digits.size()){
result.push_back(s);
return;
}
if(digits[len]<'7'){
for(int i=0;i<3;i++){
string tmp ="a";
tmp[0]=tmp[0]+i+(digits[len]-'2')*3;
bt(result,digits,s+tmp,len+1);
}
}else if(digits[len]=='7'){
for(int i=0;i<4;i++){
string tmp="p";
tmp[0]+=i;
bt(result,digits,s+tmp,len+1);
}
}else if(digits[len]=='8'){
for(int i=0;i<3;i++){
string tmp="t";
tmp[0]+=i;
bt(result,digits,s+tmp,len+1);
}
}else{
for(int i=0;i<4;i++){
string tmp="w";
tmp[0]+=i;
bt(result,digits,s+tmp,len+1);
}
}
}
};
这题也不难。