216.组合总和III
链接:代码随想录
没有剪枝,组合进阶版
class Solution { public: //组合,树的宽度是1——9,2——9.。。 高度是k //没有剪枝之前 vector<vector<int>>v; vector<int>mv; vector<vector<int>> combinationSum3(int k, int n) { backtracing(n,k,1,0); return v; } void backtracing(int n,int k,int start,int sum) { if(mv.size()==k && sum==n) { v.push_back(mv); } else { for(int j=start;j<=9;j++) { mv.push_back(j); backtracing(n,k,j+1,sum+j); mv.pop_back(); } } } };
剪枝,第一个剪枝部分是剪枝start_index
j<=n+1-(k-mv.size())
第二个剪枝部分是 sum>targetsum,则return
class Solution { public: //组合,树的宽度是1——9,2——9.。。 高度是k //没有剪枝之前 vector<vector<int>>v; vector<int>mv; vector<vector<int>> combinationSum3(int k, int n) { backtracing(n,k,1,0); return v; } void backtracing(int n,int k,int start,int sum) { if (sum > n) { // 剪枝操作 return; // 如果path.size() == k 但sum != targetSum 直接返回 } if(mv.size()==k && sum==n) { v.push_back(mv); } else { for(int j=start;mv.size()<=k && j<=(10-(k-mv.size()));j++) { mv.push_back(j); backtracing(n,k,j+1,sum+j); mv.pop_back(); } } } };
17. 电话号码的字母组合
链接:代码随想录
简单回溯,一遍过
class Solution { public: vector<string>v; string s; vector<string> letterCombinations(string digits) { int n=digits.size(); //先创建一个map,因为不要求排序,所以直接用vector,v1[0]="",v1[1]="" vector<string>v1(10,""); v1[2]="abc"; v1[3]="def"; v1[4]="ghi"; v1[5]="jkl"; v1[6]="mno"; v1[7]="pqrs"; v1[8]="tuv"; v1[9]="wxyz"; if(digits=="") { return v; } backtracing(digits,v1,0); return v; } void backtracing(string &digits,vector<string> &v1,int i) { if(i==digits.size()) { v.push_back(s); } else { string ss=v1[digits[i]-'0'];//比如示例一,i=0,ss="abc" for(int j=0;j<ss.size();j++) { s.push_back(ss[j]); backtracing(digits,v1,i+1); s.pop_back(); } } } };