代码随想录|day25|回溯算法part02----● 216.组合总和III● 17.电话号码的字母组合

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();
            }
        }

    }
};

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值