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

216.组合总和III

题目链接/文章讲解/视频讲解:代码随想录

 //216.组合总和Ⅲ
    vector<int> path;
    vector<vector<int>> result;
    int combinationSum = 0;
    void combinationSum3Backtracking(int k, int targetSum, int startIndex, int& sum) {
        //step1 确定参数
        //step2 确定终止条件
        //必须要在path的size()等于
        //k的时候才能判断,否则不满足题意
        //剪枝情况二:对sum已经大于targetSum的情况进行剪枝.
        //这种情况发生在path.size() < k时
        if (sum > targetSum) {
            return;
        }
        if (path.size() == k) {
            if (targetSum == sum) {
                result.push_back(path);
                return;
            }

        }
        //step3 确定单层逻辑
        // 剪枝情况一:对即使遍历到最底层也是
        //path.size() < k的情况进行剪枝
        //for (int i = startIndex; i <= 9; i++)
        for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) {
            sum += i;
            path.push_back(i);
            combinationSum3Backtracking(k, targetSum, i + 1, sum);
            path.pop_back();
            sum -= i;
        }
        return;
    }

    vector<vector<int>> combinationSum3(int k, int n) {
        combinationSum3Backtracking(k, n, 1, combinationSum);
        return result;
    }

 2.本题小节

        基本思路:本题和组合的思路很像。注意递归的终止条件,在path的size等于k时才能进行判断;单层递归逻辑和组合的一样,但是要注意回溯时多了sum;注意剪枝的两种情况,一种和startIndex有关,另外一种是和sum有关。

17.电话号码的字母组合

 题目链接/文章讲解/视频讲解:代码随想录

1.代码展示

 //17电话数字组合
    const string letterMap[10] = {
    "", // 0
    "", // 1
    "abc", // 2
    "def", // 3
    "ghi", // 4
    "jkl", // 5
    "mno", // 6
    "pqrs", // 7
    "tuv", // 8
    "wxyz", // 9
    };

    vector<string> vsLetterResult;
    string path;
    void letterCombinationsBackTracking(const string& digits, int index) {
        //step1 确定参数
        //step2 确定终止条件
        if (index == digits.size()) {
            //vsLetterResult.push_back(path);
            return;
        }
        //step3 确定单层迭代逻辑
        //每次遍历前取出待遍历的字母
        int nIndex = digits[index] - '0';
        string letter = letterMap[nIndex];
        //开始遍历
        for (int i = 0; i < letter.size(); i++) {
            path.push_back(letter[i]);
            //递归
            letterCombinationsBackTracking(digits, index + 1);
            //回溯
            path.pop_back();
        }
        return;

    }
    vector<string> letterCombinations(string digits) {
        if (digits.size() == 0) {
            return vsLetterResult;
        }
        letterCombinationsBackTracking(digits, 0);
        return vsLetterResult;
    }

 2.本题小节

        基本思路:本题与上一题不同的是,在两个数组中进行操作,不存在startIndex的情况,但是参数中存在index,这里的index主要是用来作为digits的下标寻找对应的字母的,在进行遍历前,需要把这些字母取出来,再对这些字母进行遍历;终止条件是index == digits.size()时,此时存入path的结果。

        思考:这里的index作为全局变量的话比较麻烦,最开始搞错了,将index作为了全局变量,每次遍历前++,忽然间懂了,这里的index也需要回溯,就在写博客的时候又去测试了一下,果然是的,每次遍历前++,遍历完毕后再--也可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值