今日内容:
- 组合总和III
- 电话号码的字母组合
详细布置
216.组合总和III
如果把 组合问题理解了,本题就容易一些了。
题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html
视频讲解:https://www.bilibili.com/video/BV1wg411873x
Tips:这道题比起组合那道题,就是多了一个sum需要考虑,其他的地方都一样,然后有两处地方可以剪枝
我的题解:
class Solution {
public:
vector<vector<int>> result;
vector<int> temp;
int sum = 0;
void backtracking(int k, int n, int begin){
if(sum == n && temp.size() == k){
result.push_back(temp);
return;
}
// 这里sum > n的话可以剪枝
if(temp.size() >= k || sum > n){
return;
}
// 这里长度不够的话也可以剪枝
for(int i = begin; i <= 9 - (k - temp.size()) + 1; i++){
sum += i;
temp.push_back(i);
backtracking(k,n,i+1);
temp.pop_back();
sum -= i;
}
}
vector<vector<int>> combinationSum3(int k, int n) {
backtracking(k,n,1);
return result;
}
};
17.电话号码的字母组合
本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。
视频讲解:https://www.bilibili.com/video/BV1yV4y1V7Ug
Tips:这道题只要有了字母本就不难,注意这里可以用一个字符串数组来定义字母本。然后输入的digits是用字符串形式给出的,要获得其中某一位的数字,可以用那一位的char与'0'相减得到。
我的题解:
class Solution {
public:
const string phone[10] = {
"", // 0
"", // 1
"abc", // 2
"def", // 3
"ghi", // 4
"jkl", // 5
"mno", // 6
"pqrs", // 7
"tuv", // 8
"wxyz", // 9
};
vector<string> result;
string path;
void backtracking(string digits, int pos){
if(pos == digits.size()){
result.push_back(path);
return;
}
int digit = digits[pos] - '0';
for(int i = 0; i< phone[digit].size();i++){
path.push_back(phone[digit][i]);
backtracking(digits, pos+1);
path.pop_back();
}
}
vector<string> letterCombinations(string digits) {
if(digits.size() == 0){
return result;
}
backtracking(digits, 0);
return result;
}
};
标签:216,digits,return,25,int,E7%,E5%,result,字母组合
From: https://www.cnblogs.com/GavinGYM/p/17073904.html