LeetCode 216 组合总和III
题目链接:https://leetcode.cn/problems/combination-sum-iii/
思路:
思路和77.组合类似,只不过多了一个和的判断
代码:
自写
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
int sum = 0;
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
sum = 0;
backtracking(k,n,1);
return result;
}
void backtracking(int k,int n,int startindex)
{
// 终止条件
if(path.size()==k&&sum==n)
{
result.push_back(path);
return ;
}
if(path.size()==k&&sum!=n)
return ;
// 单层搜索逻辑
for(int i = startindex;i<=9;i++)
{
sum += i;
path.push_back(i);
backtracking(k,n,i+1);
sum -= i;
path.pop_back();
}
}
};
优化
class Solution {
public:
vector<vector<int>>result;
vector<int>path;
int sum = 0;
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
sum = 0;
backtracking(k,n,1);
return result;
}
void backtracking(int k,int n,int startindex)
{
// 终止条件
if(path.size()==k)
{
if(sum==n)
result.push_back(path);
return ;
}
// 单层搜索逻辑
for(int i = startindex;i<=9-(k-path.size())+1;i++) // 剪枝
{
sum += i;
path.push_back(i);
backtracking(k,n,i+1);
sum -= i;
path.pop_back();
}
}
};
总结
做完昨天的77题,再做这题,相对来说比较简单,套用模板即可。注意剪枝操作。
LeetCode 17 电话号码的字母组合
题目链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number/
思路:
先用一个二维string数组完成数字->字母的映射。因为本题是在多个集合中求组合,所以用index去控制digit里的下标,而不用startindex去控制for循环i的起始值,因为之前是在一个集合中求组合,所以要排除选过的元素。此处并不需要。digit的size代表了树的深度,数字映射到字母的数量代表了宽度。
代码:
class Solution {
public:
// 数字->字母 映射表
const string Lettermap[12] =
{
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
"", // *
"", // #
};
string s; // 用于保存组合
vector<string>result; // 用于保存结果
vector<string> letterCombinations(string digits) {
s.clear();
result.clear();
if(digits.size()==0)
return result;
backtracking(digits,0);
return result;
}
void backtracking(const 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();
}
}
};
总结
没想清楚要怎么将数字映射成字母
今日总结:
今天继续练习回溯,继续加强回溯!