216.组合总和III
参考昨天的题,参数范围设置为1-9,再结合此前二叉树中112题的写法,将目标值传入即可
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(int n, int k, int startIndex){
if (path.size() == k){
if (n == 0) result.push_back(path);
return;
}
for (int i = startIndex ; i <= 9 - k + path.size() + 1; i++){
path.push_back(i);
backtracking(n-i,k,i+1);
path.pop_back();
}
return;
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
backtracking(n,k,1);
return result;
}
};
17.电话号码的字母组合
此题最大的难点在于数字和字母的映射,我此处是用哈希表来进行表示。此外部分仿照之前代码即可。
class Solution {
public:
vector<string> letterCombinations(string digits) {
vector<string> combinations;
if (digits.empty()) {
return combinations;
}
unordered_map<char, string> phoneMap{ //记住设置哈希表的方式
{'2', "abc"},
{'3', "def"},
{'4', "ghi"},
{'5', "jkl"},
{'6', "mno"},
{'7', "pqrs"},
{'8', "tuv"},
{'9', "wxyz"}
};
string combination;
backtrack(combinations, phoneMap, digits, 0, combination);
return combinations;
}
void backtrack(vector<string>& combinations,unordered_map<char,string>& phoneMap,string& digits,int index ,string& combination){
if (index == digits.size()) combinations.push_back(combination);
else {
char digit = digits[index];
const string& letters = phoneMap[digit];
for (const char& letter : letters){
combination.push_back(letter);//在字符串后加上一个字母
backtrack(combinations, phoneMap, digits, index+1, combination);
combination.pop_back();//移除最后一个字母
}
}
}
};