题目链接:216. 组合总和 III - 力扣(LeetCode)
class Solution
{
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(int k,int n,int startIndex,int sum)
{
if(path.size()==k){
if(n==sum){
result.push_back(path);
}
return;
}
for(int i=startIndex;i<=9;i++){
path.push_back(i);
sum+=i;
backtracking(k,n,i+1,sum);
sum-=i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n)
{
result.clear();
path.clear();
backtracking(k,n,1,0);
return result;
}
};
模仿昨天的一道题写的回溯算法,核心就是回溯,sum-=i,path.pop_back()。
题目链接:17. 电话号码的字母组合 - 力扣(LeetCode)
class Solution
{
private:
vector<string> result;
string str;
unordered_map<char, string> unmap = {
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}};
void backtracking(int index,const string &digits)
{
if (str.size() == digits.size())
{
result.push_back(str);
return;
}
string letters = unmap[digits[index]];
for (int i = 0; i < letters.size(); i++)
{
str.push_back(letters[i]);
backtracking(index + 1, digits);
str.pop_back();
}
}
public:
vector<string> letterCombinations(string digits)
{
if(digits.size()==0) return result;
result.clear();
str.clear();
backtracking(0,digits);
return result;
}
};
也是套用昨天学的代码,只是换了一些东西。
重点是这个递归函数里面的for循环,循环的终止条件不像之前一样是固定的,这个终止条件随着数字的变化而变化,有些数字对应的英文字母有四个,如9。所以要灵活的去判断。