77. 组合
1. 看讲解后写轮眼复刻。
2. 记住那张图。for是横向循环,确定1,2,3,4。 递归是纵向的,在选到1之后,选出2,3,4
3. 剪枝操作比较复杂,核心是在选定了1之后减少操作,在for循环里面做
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
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.push_back(i);
backtracking(n,k,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
int startindex=1;
backtracking(n,k,startindex);
return result;
}
};
216.组合总和III
1. 和上一题差不多,改变一下递归的条件就可以了
class Solution {
private:
vector<int> path;
vector<vector<int>> result;
int calcSum(vector<int>& a){
int sum=0;
for(int i=0;i<a.size();i++)
{
sum+=a[i];
}
return sum;
}
void backtracking(int n,int k,int startindex){
if(path.size()==k && calcSum(path)==n)
{
result.push_back(path);
return;
}
for(int i=startindex;i<=9;i++)
{
path.push_back(i);
backtracking(n,k,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(n,k,1);
return result;
}
};
17.电话号码的字母组合
1. string的使用,和容器一样,直接push_back ,pop_back就可以,a[10],简单朴素,和数组一样用
2. cpp中怎么把char转换成数字。 a='9', int b='9'-'0'. 通过字符串之间的差值。
3. index的变化那个地方卡了一下,每次递归的时候index的值作为backtracking的参数值 发生变化。
4. 在回溯的模板的基础上,进行变化,弄清楚for循环对应的是谁的变化,递归对应的是谁的变化
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 path;
void backtracking(const string& digits,int index)
{
if(index==digits.size())
{
result.push_back(path);
return;
}
int a=digits[index]-'0';//'9'和'0'的差值,就是这个int值
string letters=letterMap[a];// 'abc' 'def'
for(int i=0;i<letters.size();i++)
{
path.push_back(letters[i]);
backtracking(digits,index+1);//index每次作为backtracking的输入,每递归一次,值加一
path.pop_back();
}
}
public:
vector<string> letterCombinations(string digits) {
//映射关系怎么处理--->用map
path.clear();
result.clear();
if(digits.size()==0) return result;
backtracking(digits,0);
return result;
}
};