77. 组合
记住递归三部曲以及回溯三部曲。注意for循环的终止条件,一般是结果的长度大小。
class Solution {
public:
vector<int> cur;
vector<vector <int>> res;
void backtracking(int n,int k,int beg){
if(cur.size()==k)
{
res.push_back(cur);
return;
}
for(int i=beg;i<=n;i++)
{
cur.push_back(i);
backtracking(n,k,i+1);
cur.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n,k,1);
return res;
}
};
216.组合总和III
和上面一题类似,主要是注意终止条件。
class Solution {
public:
vector<int> cur;
vector<vector<int>> res;
void backtracking(int k, int n,int sum,int beg){
if(cur.size()==k && sum==n){
res.push_back(cur);
return;
}
for(int i=beg;i<=9;i++){
cur.push_back(i);
sum+=i;
backtracking(k,n,sum,i+1);
cur.pop_back();
sum-=i;
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k,n,0,1);
return res;
}
};
17.电话号码的字母组合
学习到了一种提前定义映射的方法,方便我们的数值对应。
要记得考虑输入字符为空的情况。同时考虑到其他异常情况,将其他按钮设置为空字符。
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:
string str;
vector<string> res;
void backtracking(string &digits,int index){
if(str.size()==digits.size()){
res.push_back(str);
return;
}
int temp=digits[index] - '0';
string cur=letterMap[temp];
for(int i=0;i<cur.size();i++){
str.push_back(cur[i]);
backtracking(digits,index+1);
str.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.size()==0) return res;
backtracking(digits,0);
return res;
}
};