代码随想录day22 77. 组合 、 216.组合总和III 、 17.电话号码的字母组合
77. 组合
第一次接触组合,直观的感觉就是递归调用放在for循环里了,剪枝我比较喜欢k - path.size() <= n - i + 1,左边代表还需要多少个元素,右边表示还剩多少个元素,比较直观
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void traversal(int n, int k, int startIndex) {
if (path.size() == k) {
res.push_back(path);
return;
}
for (int i = startIndex; k - path.size() <= n - i + 1; i++) {
path.push_back(i);
traversal(n, k, i + 1);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
traversal(n, k, 1);
return res;
}
};
216.组合总和III
总会出现些小问题
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void traversal(int k, int target, int startIndex) {
if (target < 0) {
return;
}
if (path.size() == k) {
if (target == 0) res.push_back(path);
return;
}
for (int i = startIndex; k - path.size() <= 10 - i; i++) {
path.push_back(i);
traversal(k, target - i, i + 1);
path.pop_back();
}
}
vector<vector<int>> combinationSum3(int k, int n) {
traversal(k, n, 1);
return res;
}
};
17.电话号码的字母组合
这道题不难,自己也能写出来
class Solution {
public:
vector<string> res;
string path;
void traversal(string digits,int idx, vector<string> & strArr) {
if (idx == digits.size()) {
if (digits.size() != 0) {
res.push_back(path);
}
return;
}
string tmp = strArr[digits[idx] - '2'];
for (int i = 0; i < tmp.size(); i++) {
path.push_back(tmp[i]);
traversal(digits, idx + 1, strArr);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
vector<string> strArr = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
traversal(digits, 0, strArr);
return res;
}
};