代码随想录算法训练营第25天|16.组合总和III|17.电话号码的字母组合
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
class Solution {
public:vector<int>path;// 符合条件的结果vector<vector<int>> result;// 存放结果集void backtracking(int targetsum,int k,int sum,int startindex){if(sum>targetsum) return; // 剪枝操作if(path.size()==k){if(sum==targetsum){result.push_back(path);return;// 如果path.size() == k 但sum != targetSum 直接返回}}for(int i=startindex;i<=9-(k-path.size())+1;i++)// 剪枝{path.push_back(i);// 处理sum+=i;// 处理backtracking(targetsum,k,sum,i+1);// 注意i+1调整startIndexsum-=i;// 回溯path.pop_back();// 回溯}}vector<vector<int>> combinationSum3(int k, int n) {result.clear();// 可以不加path.clear();// 可以不加backtracking(n,k,0,1);return result;}
};
剪枝
17.电话号码的字母组合
本题大家刚开始做会有点难度,先自己思考20min,没思路就直接看题解。
题目链接/文章讲解:https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html
视频讲解:https://www.bilibili.com/video/BV1yV4y1V7Ug
class Solution {
public://一定要画树形图const string lettermap[10]={"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9 };string s;vector<string> result;void backtracking(const string &digits,int index){if(index==digits.size()){result.push_back(s);return;}int nums=digits[index]-'0';// 将index指向的数字转为intstring str =lettermap[nums];// 取数字对应的字符集for(int i=0;i<str.size();i++){s.push_back(str[i]);// 处理backtracking(digits,index+1);// 递归,注意index+1,一下层要处理下一个数字了s.pop_back(); // 回溯}}vector<string> letterCombinations(string digits) {result.clear();s.clear();if(digits.size()==0)return result;backtracking(digits,0);return result;}
};