学习目标:
- 216.组合总和III
- 17.电话号码的字母组合
学习内容:
216.组合总和III
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(int k,int targetsum, int sum, int startIndex){
if(sum==targetsum && path.size()==k){
result.push_back(path);
return;
}
for(int i = startIndex;i<=9;i++)
{
sum+=i;
path.push_back(i);
backtracking(k,targetsum,sum,i+1); //写成startIndex+1了
sum-=i; //忘记写这个了
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
int startIndex = 1;
int sum = 0;
backtracking(k,n,sum,startIndex);
return result;
}
};
错误以及注意事项
backtracking(k,targetsum,sum,i+1); //写成startIndex+1了
写成startIndex+1的话实际上最后一个参数就一直没变,sum-=i
是回溯撤销最后一步中必要的步骤,忘记写了!- 终止条件可以补上一个
if (sum > targetsum || path.size() > k) return; // 终止条件,避免无限递归
17.电话号码的字母组合
class Solution {
public:
const string letterMap[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
string s;
vector<string> result;
void backtracking(string digits, int index){
//终止条件
if(index == digits.size())
{
result.push_back(s);
return;
}
//单层遍历
int digit = digits[index]-'0';
string letter = letterMap[digit];
for(int i=0;i<letter.size();i++){
s.push_back(letter[i]);
backtracking(digits,index+1);
s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if (digits.empty()) // 处理空字符串情况
return {};
int index = 0;
backtracking(digits,index);
return result;
}
};
错误以及注意事项
- 看了一会儿没什么思路就看视频了。
- 这里不使用startIndex的原因是,之前的是在一个集合中组合,避免元素重复所以设置了startIndex。而这道题是多个集合中各取一个,那就不需要设置startIndex,直接使用index表示选取集合中的第几个就是了。
- leetcode中给的一个测试范例是空string,所以当digits.empty()的时候,直接return {} 空集合即可。
//方法2
学习时间:
2024.2.20 20:40-21:40 等待服务器恢复,又着急开题又着急工作又着急英语又想出国玩的我。