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

发布时间:2024年01月12日

题目: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;
    }
};
文章来源:https://blog.csdn.net/m0_71413464/article/details/135425197
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。