回溯法 模板
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
77. 组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。
class Solution {
vector<vector<int>> result;
vector<int> path;
void backtracking(int n, int k, int startIndex) {
if (path.size() == k) {
result.push_back(path);
return;
}
// for (int i = startIndex; i <= n; i++) {
// 如果起始位置之后的元素个数,不足于我们需要的个数 不必搜索
//已选择个数 path.size()
//还需要个数 k-path.size()
//起始位置最晚于 n - (k - path.size()) + 1
for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) {
path.push_back(i); // 处理节点
backtracking(n, k, i + 1); // 递归
path.pop_back(); // 回溯,撤销处理的节点
}
}
public:
vector<vector<int>> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
};
216.组合总和III
找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9;每个数字 最多使用一次 返回 所有可能的有效组合的列表
。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
class Solution {
vector<vector<int>> res;
vector<int> path;
void backtracing(int k, int n, int startIndex, int sum) {
if (sum == n && path.size() == k) { // 必须是 k 个数的和
res.push_back(path);
return;
}
// for(int i = startIndex; i <= 9; ++i) {
// 剪枝操作
for(int i = startIndex; i <= 9- (k - path.size()) + 1 && sum + i <= n && path.size() < k; ++i) {
path.push_back(i);
sum += i;
backtracing(k, n, i + 1, sum);
sum -= i;
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
backtracing(k, n, 1, 0);
return res;
}
};
17.电话号码的字母组合
class Solution {
vector<string> letterMap = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
string temp;
vector<string> res;
void backtracing(string& digits, int startIndex) {
if (temp.size() == digits.size()) {
res.push_back(temp);
return;
}
string s = letterMap[digits[startIndex] - '0']; // 取出数字对应的字母表
for (int i = 0; i < s.size(); ++i){
// 对于每一个不同的数字对应的字母表(求不同的的集合的组合)我们都是从0开始遍历
// 区别于 77 组合,求同一个集合中的组合
temp += s[i];
backtracing(digits, startIndex + 1);
temp.pop_back();
}
return;
}
public:
vector<string> letterCombinations(string digits) {
if (digits.size() == 0) {
return {};
}
backtracing(digits, 0);
return res;
}
};