本文主要是介绍算法训练营第二十八天 | LeetCode 77 组合(剪枝优化)、LeetCode 216 组合总和III、LeetCode 17 电话号码的字母组合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
LeetCode 77 组合(剪枝优化)
当我们到达某一层,后面的结点数已经不能满足条件时。可以进行剪枝操作。
代码如下:
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
其实也很简单,回溯问题主要是要掌握递归模板,之后的过程就是在凑参数、返回条件和递归逻辑了。具体可以去看看代码随想录里面讲解,会很懂很多。有很多图片,比如下面这个
代码如下:
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类里的函数。
代码如下:
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;}
};
这篇关于算法训练营第二十八天 | LeetCode 77 组合(剪枝优化)、LeetCode 216 组合总和III、LeetCode 17 电话号码的字母组合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!