1、LeetCode216 组合总和III
题目链接:216、组合总和III
当path.size()==k,且sum == targetSum 时,result.push_back(path)。
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backstracking(int targetsum, int k, int sum, int startIndex)
{
if (path.size() == k)
{
if (sum == targetsum) result.push_back(path);
return;
}
for (int i = startIndex; i <= 9; i++)
{
path.push_back(i);
sum += i;
backstracking(targetsum, k, sum, i + 1);
sum -= i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
backstracking(n, k, 0, 1);
return result;
}
};
去剪枝操作有两个:
9 - (k - path.size())+ 1;
if (sum > targetsum) return;
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backstracking(int targetsum, int k, int sum, int startIndex)
{
if (sum > targetsum)
{
return;
}
if (path.size() == k)
{
if (sum == targetsum) result.push_back(path);
return;
}
for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++)
{
path.push_back(i);
sum += i;
backstracking(targetsum, k, sum, i + 1);
sum -= i;
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
result.clear();
path.clear();
backstracking(n, k, 0, 1);
return result;
}
};
2、LeetCode17 电话号码的字母组合
题目链接:17、电话号码的字母总和
定义了一个映射数组,没有想到。
字符转数字的方式。
不再使用startIndex,前两题是在一个集合里,本题在不同的集合。
class Solution {
public:
const string Map[10] = {
"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"
};
vector<string> result;
string s;
void traversal(const string& digits, int index)
{
if (s.size() == digits.size())
{
result.push_back(s);
return;
}
int num = digits[index] - '0';
string letter = Map[num];
for (int i = 0; i < letter.size(); i++)
{
s.push_back(letter[i]);
traversal(digits, index + 1);
s.pop_back();
}
}
vector<string> letterCombinations(string digits) {
result.clear();
s.clear();
if (digits.size() == 0)
{
return result;
}
traversal(digits, 0);
return result;
}
};