一、题目打卡
1.1 组合III
题目链接:. - 力扣(LeetCode)
class Solution {
private:
int sum = 0;
vector<int> tmp;
vector<vector<int>> res;
void backtracking(int k, int n, int startIndex){
if(sum == n && tmp.size() == k){
res.push_back(tmp);
return;
}
if(sum > n) return;
for(int i = startIndex; i <= 9 ; i++){
sum += i;
tmp.push_back(i);
backtracking(k,n,i + 1);
sum -= i;
tmp.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k,n,1);
return res;
}
};
1.2 电话号码的字母组合
题目链接:. - 力扣(LeetCode)
class Solution {
public:
unordered_map<char,string> m;
Solution(){
m.emplace('2',"abc");
m.emplace('3',"def");
m.emplace('4',"ghi");
m.emplace('5',"jkl");
m.emplace('6',"mno");
m.emplace('7',"pqrs");
m.emplace('8',"tuv");
m.emplace('9',"wxyz");
}
string path;
vector<string> res;
void backTracking(string& digits, int i){
// if(i >= digits.size()) return;
string tmp = m[digits[i]];
if(path.size() == digits.size()){
res.push_back(path);
return;
}
for(int it = 0; it < tmp.size();it++){
path.push_back(tmp[it]);
backTracking(digits, i + 1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.empty()) return {};
backTracking(digits,0);
return res;
}
};
这个题目本质上也是之前讲过的回溯模板,只是这里需要增加一个哈希的映射来处理不同的数字和字符串的对应,然后觉得这种类型题目不好理解的时候可以画一个 n 叉树来帮助理解,对这个题目而言,n 叉树的子树代表了这一层数组不同索引的值,而递归的深度代表的是一开始digit 的大小,整体来看就是每层树的 root 取一个值,直到path的size满足要求。