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


    n216.组合总和III

    如果把 组合问题理解了,本题就容易一些了。

    题目链接/文章讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html
    视频讲解:https://www.bilibili.com/video/BV1wg411873x
    题目大意:
    找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
    说明:

    • 所有数字都是正整数。
    • 解集不能包含重复的组合。

    思路:
    要找到和为n的k个数的组合,而整个集合已经是固定的。

    class Solution {
    private:
        vector<vector<int>> result; // 存放结果集
        vector<int> path; // 符合条件的结果
        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++) { // 剪枝
                sum += i; // 处理
                path.push_back(i); // 处理
                backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndex
                sum -= i; // 回溯
                path.pop_back(); // 回溯
            }
        }
    
    public:
        vector<vector<int>> combinationSum3(int k, int n) {
            result.clear(); // 可以不加
            path.clear();   // 可以不加
            backtracking(n, k, 0, 1);
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    时间复杂度: O(n * 2^n)
    空间复杂度: O(n)

    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

    题目大意:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

    给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

    思路:解决如下三个问题:

    • 数字和字母如何映射
    • 两个字母就两个for循环,三个字符我就三个for循环,以此类推,然后发现代码根本写不出来
    • 输入1 * #按键等等异常情况
    class Solution {
    private:
        const string letterMap[10] = {
            "", // 0
            "", // 1
            "abc", // 2
            "def", // 3
            "ghi", // 4
            "jkl", // 5
            "mno", // 6
            "pqrs", // 7
            "tuv", // 8
            "wxyz", // 9
        };
    public:
        vector<string> result;
        string s;
        void backtracking(const string& digits, int index) {
            if (index == digits.size()) {
                result.push_back(s);
                return;
            }
            int digit = digits[index] - '0';        // 将index指向的数字转为int
            string letters = letterMap[digit];      // 取数字对应的字符集
            for (int i = 0; i < letters.size(); i++) {
                s.push_back(letters[i]);            // 处理
                backtracking(digits, index + 1);    // 递归,注意index+1,一下层要处理下一个数字了
                s.pop_back();                       // 回溯
            }
        }
        vector<string> letterCombinations(string digits) {
            s.clear();
            result.clear();
            if (digits.size() == 0) {
                return result;
            }
            backtracking(digits, 0);
            return result;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    时间复杂度: O(3^m * 4^n),其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数
    空间复杂度: O(3^m * 4^n)

  • 相关阅读:
    java中的instanceof 的用法
    数字图像处理——实验四 数字图像的边缘检测实验
    aisr接入指引
    如何通过低代码平台搭建以“督办”为中心的办公管理系统
    Altium Designer 22 修改选中元件的层属性
    [Qt网络编程]之UDP通讯的简单编程实现
    【C++】spdlog光速入门,C++logger最简单最快的库
    C语言-函数
    【华为OD机试python】数据分类【2023 B卷|100分】
    java抽象类(强制子类重写全部)
  • 原文地址:https://blog.csdn.net/m0_52925186/article/details/136784758