216.组合总和III
这道题其实也类似,只不过目标变成了求和
1.仿照昨天的做法
vector<vector<int>> res;
vector<int> path;
int sum;
void backtracing(int n, int k, int start)
{
if (path.size() == k)
{
if (sum == n) res.push_back(path);
else return;
}
for (int i = start; i <= 9; i++)
{
sum += i; path.push_back(i);
backtracing(n, k, i + 1);
sum -= i; path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
res.clear();
path.clear();
sum = 0;
backtracing(n, k, 1);
return res;
}
2.剪枝
显然,如果sum已经超过n,即可返回。
if (sum > n) return;
17.电话号码的字母组合
1.自己写的
vector<string> res;
string path;
unordered_map<char, string> map = {{'2',"abc"}, {'3', "def"}, {'4', "ghi"}, {'5', "jkl"}, {'6', "mno"}, {'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"}};
void backtracing(int index, const string& digits)
{
if (index == digits.size())
{
res.push_back(path);
return;
}
for (auto x : map[digits[index]])
{
path.push_back(x);
backtracing(index + 1, digits);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
res.clear();
path.clear();
if (digits.size() == 0) return res;
backtracing(0, digits);
return res;
}
2.代码随想录的办法
感觉自己蠢了,思维定势了,看到映射就map了,其实可以直接用string的数组就够表示了。