方法:回溯
class Solution {
private:
vector<vector<int>> res;
vector<int> path;
void dfs(int k, int target, int sum, int idx) {
if (sum > target) return ;
if (path.size() == k) {
if (sum == target) res.emplace_back(path);
return ;
}
for (int i = idx; i<= 9 - (k - path.size()) + 1; ++i) {
sum += i;
path.emplace_back(i);
dfs(k, target, sum, i + 1);
path.pop_back();
sum -= i;
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
res.clear();
path.clear();
dfs(k, n, 0, 1);
return res;
}
};
$时间复杂度O(k),空间复杂度O(k+m)
方法:回溯
class Solution {
private:
const string letterMap[10] = {
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
};
vector<string> res;
string str;
void dfs(const string& digits, int idx, const string& str) {
if (idx == digits.size()) {
res.emplace_back(str);
return ;
}
int digit = digits[idx] - '0';
string letters = letterMap[digit];
for (int i = 0; i < letters.size(); ++i) {
dfs(digits, idx + 1, str+letters[i]);
}
}
public:
vector<string> letterCombinations(string digits) {
res.clear();
if (digits.size() == 0) return res;
dfs(digits, 0, str);
return res;
}
};
$时间复杂度O(),空间复杂度O(n+m)。
其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9),m+n 是输入数字的总个数。当输入包含 m 个对应 3 个字母的数字和 n 个对应 4个字母的数字时,不同的字母组合一共有 种。