代码随想录算法训练营第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调整startIndex
            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.电话号码的字母组合
本题大家刚开始做会有点难度,先自己思考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指向的数字转为int
        string 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;
    }
};




















