算法训练营第二十八天 | LeetCode 77 组合(剪枝优化)、LeetCode 216 组合总和III、LeetCode 17 电话号码的字母组合

LeetCode 77 组合(剪枝优化)

当我们到达某一层,后面的结点数已经不能满足条件时。可以进行剪枝操作。

代码如下:

cpp 复制代码
class Solution {
private:
    vector<int> path;
    vector<vector<int>> res;
    void backtracking(int n, int index, int k) {
        if (path.size() == k) {
            res.push_back(path);
            return;
        }
        if (index == n + 1) return;
        for (int i = index; i <= n; i++) {
            if (n - i + 1 < k - path.size()) return;
            path.push_back(i);
            backtracking(n, i + 1, k);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, 1, k);
        return res;
    }
};

主要在for循环中加了一个判断条件。

LeetCode 216 组合总和III

其实也很简单,回溯问题主要是要掌握递归模板,之后的过程就是在凑参数、返回条件和递归逻辑了。具体可以去看看代码随想录里面讲解,会很懂很多。有很多图片,比如下面这个

代码如下:

cpp 复制代码
class Solution {
private:
    vector<int> path;
    vector<vector<int>> res;
    void backtracking(int k, int num, int index) {
        if (path.size() == k) {
            if (num == 0) {
                res.push_back(path);
            }
            return;
        }
        for (int i = index; i <= 9; i++) {
            if (9 - i + 1 < k - path.size()) return;
            path.push_back(i);
            backtracking(k, num - i, i + 1);
            path.pop_back();
        }
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        backtracking(k, n, 1);
        return res;
    }
};

LeetCode 17 电话号码的字母组合

这题本身其实不难,不过有点绕。要用一个字符串类型向量记录每个电话号码数字对应的几个字符组成的字符串,在回溯的时候对应查找,作为查找表使用。

转化时用到stoi和atoi,都报错,最后用字符串减法,直接每个字符-'0'解决了问题。查资料可以发现,两者都是适配于字符串类型而非单个字符的,差别在于一个是c语言函数,一个是C++下的string类里的函数。

代码如下:

cpp 复制代码
class Solution {
private:
    string path;
    vector<string> res;
    void backtracking(string digits, int index, vector<string>& s) {
        if (path.size() == digits.size()) {
            res.push_back(path);
            return;
        }
        int i_index = digits[index] - '0';
        for (int i = 0; i < s[i_index].length(); i++) {
            string temp = path;
            path += s[i_index][i];
            backtracking(digits, index + 1, s);
            path = temp;
        }
    }
public:
    vector<string> letterCombinations(string digits) {
        if (digits.size() == 0) return res;
        vector<string> s(10, "");
        s[2] = "abc"; s[3] = "def"; s[4] = "ghi"; s[5] = "jkl"; s[6] = "mno";
        s[7] = "pqrs"; s[8] = "tuv"; s[9] = "wxyz";
        backtracking(digits, 0, s);
        return res;
    }
};
相关推荐
职略34 分钟前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
A227436 分钟前
LeetCode 196, 73, 105
java·算法·leetcode
阿里巴巴P8资深技术专家2 小时前
Java常用算法&集合扩容机制分析
java·数据结构·算法
zengson_g2 小时前
当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
java·数据库·算法·排序算法
爱上电路设计3 小时前
有趣的算法
开发语言·c++·算法
Kerry_65 小时前
2024年江苏省研究生数学建模科研创新实践大赛C题气象数据高精度融合技术研究论文和代码分析
算法·数学建模·matlab·数据分析
风啊雨5 小时前
刷题Day44|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
算法
yachihaoteng5 小时前
Studying-代码随想录训练营day27| 贪心算法理论基础、455.分发饼干、376.摆动序列、53.最大子序和
c++·算法·leetcode·贪心算法
逸群不凡5 小时前
C++|哈希应用->布隆过滤器
开发语言·数据结构·c++·算法·哈希算法
LNTON羚通6 小时前
视频共享融合赋能平台LnyonCVS国标视频监控平台包含哪些功能
大数据·网络·人工智能·算法·音视频