代码随想录day25 | 216. 组合总和 III 17. 电话号码的字母组合
216. 组合总和 III
思路
这道题是一道典型的组合问题,套用回溯模板进行考虑。
- 考虑参数和返回值。
很明显,返回值为void,参数包括n,k。因为要判断相加之和,需要一个参数sum记录当前组合的总和,此外我们还需要一个参数startIndex来控制回溯。
void backTracking(const int& n, const int& k, int startIndex) - 考虑终止条件。
- 当
sum == n时,将路径加入结果并返回。 - 当
sum > n时,直接返回。
- 单次循环逻辑。
从startIndex开始进行遍历。
for(i = startIndex; i <= 9; i++)
题中要求每个数字只能使用一次,因此将i+1作为新的startIndex传递。 - 剪枝
可以对遍历过程进行剪枝。当数组中剩余元素不足时,不再遍历。
i <= 9 - (k - path.size() + 1)
实现
点击查看代码
class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
traversal(n, k, 1, 0);
return result;
}
vector<int> path;
vector<vector<int>> result;
void traversal(int& n, int& k, int startIndex, int sum) {
if(sum > n) return;
if(path.size() == k) {
if(sum == n) {
result.push_back(path);
}
return;
}
for(int i = startIndex; i <= 9 - (k-path.size()) + 1; i++) {
path.push_back(i);
traversal(n, k, i+1, sum+i);
path.pop_back();
}
}
};
17. 电话号码的字母组合
思路
1.题目的难点在于如何将数字映射到字母,有两种方法,数组和map。
实现之后这道题将会迎刃而解。
实现
点击查看代码
class Solution {
public:
vector<string> letterCombinations(string digits) {
if(digits.size() == 0) return result;
traversal(digits,0,path);
return result;
}
private:
const string phone[12] = {
"",
"",
"abc",
"def",
"ghi",
"jkl",
"mno",
"pqrs",
"tuv",
"wxyz",
"",
"",
};
string path;
vector<string> result;
void traversal(string& digits, int count, const string& path) {
if(path.size() == digits.size()) {
result.push_back(path);
return;
}
int digit = digits[count] - '0';
string letter = phone[digit];
for(int i = 0; i < letter.size(); i++) {
traversal(digits, count+1, path+letter[i]);
}
}
};


浙公网安备 33010602011771号