代码随想录算法训练营第二十五天 | 216.组合总和III、17.电话号码的字母组合

题目:216.组合总和III

文章链接:代码随想录

视频链接:LeetCode:216.组合总和III

题目链接:力扣题目链接

解法1:

class Solution {
public:
    vector<vector<int>> result; //结果集合
    vector<int> path;  // 用来存放符合条件结果
    // targetSum 目标和, k集合要求个数, sum 已经收集元素之和, starIndex 下一层for循环起点
    void backtracking(int targetSum, int k, int sum,int starIndex){

        if(sum >targeSum) return; // 剪枝,当sum大于目标值时,直接返回

        if(path.size() == k){           // 长度满足,控制深度
            // 长度满足并且总和满足
            if(targetSum == sum)  result.push_back(path); // 加入到结果集中
            // 如果是放在 if(targetSum == sum)里面则是,下一层再放入一个数后,不满足条件再返回
            return;  // 如果path.size() == k 但sum != targetSum 直接返回
        }
        
        // k-path.size() 至多需要这么多个元素,满足 path.size()==k, +1是为了坐标对齐
        for(int i = starIndex; i<= 9-(k-path.size())+1; i++){ //广度,数组中横向都遍历
        // 每递归一层都会进行一个for循环,所以不用重复再写第二个for
           sum += i;
           path.push_back(i); // 处理节点
           backtracking(targetSum ,k , sum, i+1);  // 递归 starIndex增大,控制遍历长度
           sum -= i ;
           path.pop_back(); // 回溯,撤销处理的节点
           }
        }
   
    vector<vector<int>> combinationSum3(int k, int n) {
        result.clear();
        path.clear();
        backtracking(n, k, 0, 1);  
        return result;
    }
};

题目:17.电话号码的字母组合

 文章链接:代码随想录

视频链接:LeetCode:17.电话号码的字母组合

题目链接:力扣题目链接

解法1:

class Solution {
public:
    string s; 
    vector<string> result;
    const string letterMap[10]={  
        "",    // 0
        "",    // 1
        "abc", // 2
        "def", // 3
        "ghi", // 4
        "jkl", // 5
        "mno", // 6
        "pqrs", // 7
        "tuv", // 8
        "wxyz", // 9
    }; //定义 数组要用};结尾

    // index 表示遍历字符串"234" 当前数字的下标
    void backtracking(const string& digits, int index){
        // 终止条件
        if(digits.size() == index){  //当index == 3, digits[3]为空时,终止
            result.push_back(s); 
            return;
        }
        int digit = digits[index]-'0'; //获取字符串digits中的数字  digit==2
        string letter = letterMap[digit];  // letter == "abc"
        for(int i=0; i<letter.size(); i++){ // 循环遍历letter中的每个值
             s.push_back(letter[i]); // 放进字符串中 s =="a"
             backtracking(digits, index+1); // index+1 遍历 digits[1] == 3   s=="ad"
             s.pop_back(); // 回溯  s =="a" 后序再加 ae
        }  
    }
    vector<string> letterCombinations(string digits) {
          s.clear();
          result.clear();
          if(digits.size() == 0) return result;
          backtracking(digits,0);
          return result;
    }
};
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值