77. 组合
https://leetcode.cn/problems/combinations/
class Solution {
private:
vector<vector<int>> result; //存放符合条件结果的集合
vector<int> path; //存放符合条件结果
void huisu(int n,int k, int startIndex){
if(path.size() == k){
result.push_back(path);
return;
}
for (int i = startIndex; i<=n - (k - path.size()) + 1; i++){ //i为本次搜索的起始位置
path.push_back(i); //处理节点
huisu(n,k,i+1); //递归处理
path.pop_back(); //回溯,撤销处理的节点
}
}
public:
vector<vector<int>> combine(int n, int k) {
result.clear();
path.clear();
huisu(n,k,1);
return result;
}
};
216.组合总和III
https://leetcode.cn/problems/combination-sum-iii/description/
class Solution {
private:
vector<vector<int>> result; //存放结果集
vector<int> path; //符合条件的结果
void huisu(int targetSum, int k, int sum, int startIndex){
//targetSum 目标和 sum path中元素的总和 startIndex 下一层for循环搜索的起始位置
if(path.size() == k){
if (sum == targetSum)
result.push_back(path);
return; //当sum != targetSum 直接返回
}
for (int i = startIndex; i<=9 - (k - path.size()) + 1; i++){ // 剪枝
sum += i;
path.push_back(i);
if(sum > targetSum){
//剪枝
sum -= i;
path.pop_back();
return;
}
huisu(targetSum, k,sum, i+1); //startIndex向后移动一位
sum -= i; // 回溯
path.pop_back(); //回溯
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
huisu(n,k,0,1);
return result;
}
};
17.电话号码的字母组合
https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/
有点难,需要多刷理解
class Solution {
private:
const string letterMap[10] = {
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
public:
vector<string> result;
string s;
void huisu(const string& digits, int index){
if(index == digits.size()){ //终止条件
result.push_back(s);
return;
}
int digit = digits[index] - '0'; // 将index指向的数字转为int
string letters = letterMap[digit]; //取数字对应的字符集
for (int i = 0; i < letters.size(); i++){
s.push_back(letters[i]);
huisu(digits, index+1);
s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
s.clear();
result.clear();
if(digits.size() == 0){
return result;
}
huisu(digits, 0);
return result;
}
};