提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、216组合总和III
class Solution {
public:
void backtracking(vector<vector<int>>& res, vector<int>& path, int target, int sumNum, int startNum, int k) {
if (sumNum == target && path.size() == k) {
res.push_back(path);
}
if (sumNum >= target || path.size() >= k) return;
for (int i = startNum; i < 10; i ++) {
path.push_back(i);
backtracking(res, path, target, sumNum + i, i + 1, k);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> res;
vector<int> path;
int sumNum = 0;
int startNum = 1;
backtracking(res, path, n, sumNum, startNum, k);
return res;
}
};
剪枝优化:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void backtracking(int target, int sumNum, int startNum, int k) {
if (sumNum == target && path.size() == k) {
res.push_back(path);
}
if (sumNum >= target || path.size() >= k) return;
for (int i = startNum; i < (10 - (k - path.size()) + 1); i ++) {
path.push_back(i);
backtracking(target, sumNum + i, i + 1, k);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
int sumNum = 0;
int startNum = 1;
backtracking(n, sumNum, startNum, k);
return res;
}
};
二、17电话号码的字母组合
class Solution {
public:
vector<string> res;
string path;
unordered_map<int, string> phoneMap = {
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
void backtracking(string digits) {
if (path.size() == digits.size()){
res.push_back(path);
return;
}
for (char ch: phoneMap[digits[path.size()]]) {
path += ch;
backtracking(digits);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if (digits.size() == 0) return res;
backtracking(digits);
return res;
}
};
手机号对应字母也可以用二维数组存储。