哪些网站可以做网店,常州市城乡建设学院网站,wordpress批量定时自动发布文章,21天学会网站开发第一题#xff1a;
原题链接#xff1a;77. 组合 - 力扣#xff08;LeetCode#xff09;
思路#xff1a;
经典的回溯模板题#xff1a;
终止条件#xff0c;当中间变量用来存储单个结果的大小等于k#xff0c;则将中间变量存放到结果数组中。
一个for循环横向遍历…第一题
原题链接77. 组合 - 力扣LeetCode
思路
经典的回溯模板题
终止条件当中间变量用来存储单个结果的大小等于k则将中间变量存放到结果数组中。
一个for循环横向遍历递归为纵向遍历。
递归后要进行回溯。
代码如下
class Solution {
public:vectorvectorint combine(int n, int k) {backtracking(n, k, 1);return res;}
private:vectorvectorint res;vectorint path;void backtracking(int n, int k, int startIndex){if(path.size() k){res.push_back(path);return;}for(int i startIndex; i n; i){path.push_back(i);backtracking(n, k, i 1);path.pop_back();}}
};
第二题
原题链接216. 组合总和 III - 力扣LeetCode
思路
同样的回溯模板题
需要用一个sum来记录当前所有元素加起来的值是多少然后和n进行比较即可。同时需要一个path来记录单个组合。
回溯的时候单个组合要pop_back()sum要pop掉的那个值。
代码如下
class Solution {
public:vectorvectorint combinationSum3(int k, int n) {backtracking(k, n, 0, 1);return res;}
private:vectorvectorint res;vectorint path;void backtracking(int k, int n, int sum, int startIndex){if(path.size() k sum n){res.push_back(path);return;}for(int i startIndex; i 9; i){path.push_back(i);sum i;backtracking(k, n, sum, i 1);sum - i;path.pop_back();}}
};
第三题
原题链接17. 电话号码的字母组合 - 力扣LeetCode
思路
这题是有思路但是写不出来。
for循环遍历的是字符串中每个数字对应的英文字母。
递归是为了找到下一个位置的数字对应的英文字母。
需要用Index来指向当前遍历到字符串的哪个位置。在递归的时候1表示遍历到下一个位置。
本题需要用一个string数组来记录每个数字对应的字符串。注意0和1下标对应的字符串为空。从2开始才有字符串。
终止条件
中间变量的大小等于输入字符串的大小则存放入res数组中。
先将输入字符串的字符转换为数字。然后在找到数字对应的字符串后进行for循环。
最后就是进行递归和回溯。
代码如下
class Solution {
public:vectorstring letterCombinations(string digits) {if(digits.size() 0) return {};backtracking(digits, 0);return res;}
private:const string lettermap[10] {,,abc,def,ghi,jkl,mno,pqrs,tuv,wxyz,};vectorstring res;string s;void backtracking(string digits, int index){if(s.size() digits.size()){res.push_back(s);return;}int num digits[index] - 0;string letter lettermap[num];for(int i 0; i letter.size(); i){s letter[i];backtracking(digits, index 1);s.pop_back();}}
};