216.组合总和III
class Solution {
public:
vector<int> curPath;
vector<vector<int>> result;
void BackTracking(int n, int k, int resIndex){
if (curPath.size()==k) {
result.push_back(curPath);
return ;
}
for (int i=resIndex; i<=n+1-(k-curPath.size()); i++){
curPath.push_back(i);//将当前元素加入路径
BackTracking(n, k, i+1);//将当前路径和剩下的元素递归
curPath.pop_back();//弹出当前元素,为加入下一个本层剩余元素准备
}
}
vector<vector<int>> combine(int n, int k) {
BackTracking(n, k, 1);
return result;
}
};
回忆一下昨天写的组合,很容易能写出来答案。主要是对终止处理那里进行了修改,增加了对path的和的筛选。
初见杀。
17.电话号码的字母组合
class Solution {
public:
string cur;
map<int, string> numsMap = {
{0, ""},
{1, ""},
{2, "abc"},
{3, "def"},
{4, "ghi"},
{5, "jkl"},
{6, "mno"},
{7, "pqrs"},
{8, "tuv"},
{9, "wxyz"},
};
vector<string> result;
void BackTracking(int index, string digits){//index是当前深度, digits是总深度
if (cur.size()==digits.size()){
result.push_back(cur);
return ;
}
int digital = digits[index]-'0';//当前深度的序号
string letters = numsMap[digital];
for (int i=index; i<digits.size(); i++){
for (char ch : letters){
cur.push_back(ch);
BackTracking(i+1, digits);
cur.pop_back();
}
}
return;
}
vector<string> letterCombinations(string digits) {
if (digits.size()==0){
return result;
}
BackTracking(0, digits);
return result;
}
};
生病了头晕,for (int i=index; i<digits.size(); i++){这里和卡哥写的不一样答案对的,明天看吧。
电话号码这道题,卡哥的写法:
class Solution {
public:
string cur;
map<int, string> numsMap = {
{0, ""},
{1, ""},
{2, "abc"},
{3, "def"},
{4, "ghi"},
{5, "jkl"},
{6, "mno"},
{7, "pqrs"},
{8, "tuv"},
{9, "wxyz"},
};
vector<string> result;
void BackTracking(int index, string digits){//index是当前深度, digits是总深度
if (cur.size()==digits.size()){
result.push_back(cur);
return ;
}
int digital = digits[index]-'0';//当前深度的序号
string letters = numsMap[digital];
//注意到这里比我写的方法少了一个对index去重的操作,实际上也不需要我那个for (i=index; i<digitas.size(), i++)
// 因为index在下面for循环的BackTracking(index + 1, digits);中已经更新为后一个index了。
for (char ch : letters){
cur.push_back(ch);
BackTracking(index + 1, digits);
cur.pop_back();
}
return;
}
vector<string> letterCombinations(string digits) {
if (digits.size()==0){
return result;
}
BackTracking(0, digits);
return result;
}
};