文档讲解:代码随想录 (programmercarl.com)
视频讲解:和组合问题有啥区别?回溯算法如何剪枝?| LeetCode:216.组合总和III_哔哩哔哩_bilibili
第二十四天,回溯正式进入正轨了。
216.组合总和III
思路:targetsum即目标和,sum是已经收集的元素的总和。
class solution{
private:
vector<int> path;
vector<vector<int>> result;
void backtracking(int targetsum, int k, int sum, int startindex){
if(sum > targetsum) return;//剪枝
if(path.size() == k){
if(targetsum == sum){
result.push_back(path);
}
return;
}
for(int i = startindex; i <= 9; i++){
sum += i;
path.push_back(i);
backtracking(targetsum, k, sum, i + 1);
sum -= i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationsum3(int k, int n){
result.clear();
path.clear();
backtracking(n, k, 0, 1);
return result;
}
};
思路:定义一个lettermap二位数组作映射,digits是输入数字,index用来记录遍历到第几个数字。
class Solution {
private:
const string lettermap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
public:
vector<string> result;
string s;
void backtracking(string digits, int index){
if(index == digits.size()){
result.push_back(s);
return;
}
int digit = digits[index] - '0';
string letters = lettermap[digit];
for(int i = 0; i < letters.size(); i++){
s.push_back(letters[i]);
backtracking(digits, index + 1);
s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
s.clear();
result.clear();
if(digits.size() == 0) return result;
backtracking(digits, 0);
return result;
}
};
总结:突然觉得不太好懂了,确实抽象。