一、组合总和III
题目一:216. 组合总和III
找出所有相加之和为 n
的 k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
/*
* @lc app=leetcode.cn id=216 lang=cpp
*
* [216] 组合总和 III
*/
// @lc code=start
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int>> result;
vector<int> combination;
findCombinations(result, combination, 1, k, n);
return result;
}
private:
void findCombinations(vector<vector<int>>& result, std::vector<int>& combination, int start, int k, int n) {
if (n == 0 && combination.size() == k) {
result.push_back(combination);
return;
}
for (int i = start; i <= 9; ++i) {
if (n - i < 0) break;
combination.push_back(i);
findCombinations(result, combination, i + 1, k, n - i);
combination.pop_back();
}
}
};
// @lc code=end
二、 电话号码的字母组合
题目一:17. 电话号码的字母组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
/*
* @lc app=leetcode.cn id=17 lang=cpp
*
* [17] 电话号码的字母组合
*/
// @lc code=start
class Solution {
public:
vector<string> letterCombinations(string digits) {
if (digits.empty()) return {};
vector<string> result;
string current;
dfs(digits, 0, current, result);
return result;
}
private:
void dfs(const string& digits, int index, string& current, vector<string>& result) {
static const vector<string> mapping = {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
if (index == digits.size()) {
result.push_back(current);
return;
}
const string& letters = mapping[digits[index] - '2'];
for (char letter : letters) {
current.push_back(letter);
dfs(digits, index + 1, current, result);
current.pop_back();
}
}
};
// @lc code=end