文章链接:代码随想录
视频链接:LeetCode:216.组合总和III
题目链接:力扣题目链接
解法1:
class Solution {
public:
vector<vector<int>> result; //结果集合
vector<int> path; // 用来存放符合条件结果
// targetSum 目标和, k集合要求个数, sum 已经收集元素之和, starIndex 下一层for循环起点
void backtracking(int targetSum, int k, int sum,int starIndex){
if(sum >targeSum) return; // 剪枝,当sum大于目标值时,直接返回
if(path.size() == k){ // 长度满足,控制深度
// 长度满足并且总和满足
if(targetSum == sum) result.push_back(path); // 加入到结果集中
// 如果是放在 if(targetSum == sum)里面则是,下一层再放入一个数后,不满足条件再返回
return; // 如果path.size() == k 但sum != targetSum 直接返回
}
// k-path.size() 至多需要这么多个元素,满足 path.size()==k, +1是为了坐标对齐
for(int i = starIndex; i<= 9-(k-path.size())+1; i++){ //广度,数组中横向都遍历
// 每递归一层都会进行一个for循环,所以不用重复再写第二个for
sum += i;
path.push_back(i); // 处理节点
backtracking(targetSum ,k , sum, i+1); // 递归 starIndex增大,控制遍历长度
sum -= i ;
path.pop_back(); // 回溯,撤销处理的节点
}
}
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
backtracking(n, k, 0, 1);
return result;
}
};
?文章链接:代码随想录
题目链接:力扣题目链接
解法1:
class Solution {
public:
string s;
vector<string> result;
const string letterMap[10]={
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
}; //定义 数组要用};结尾
// index 表示遍历字符串"234" 当前数字的下标
void backtracking(const string& digits, int index){
// 终止条件
if(digits.size() == index){ //当index == 3, digits[3]为空时,终止
result.push_back(s);
return;
}
int digit = digits[index]-'0'; //获取字符串digits中的数字 digit==2
string letter = letterMap[digit]; // letter == "abc"
for(int i=0; i<letter.size(); i++){ // 循环遍历letter中的每个值
s.push_back(letter[i]); // 放进字符串中 s =="a"
backtracking(digits, index+1); // index+1 遍历 digits[1] == 3 s=="ad"
s.pop_back(); // 回溯 s =="a" 后序再加 ae
}
}
vector<string> letterCombinations(string digits) {
s.clear();
result.clear();
if(digits.size() == 0) return result;
backtracking(digits,0);
return result;
}
};