216.组合总和III

力扣题目链接

思路

  • 在组合的基础上加限制条件
  • 剪枝操作
//当和大于n时,往后遍历没有意义,剪枝
if(sum>n){return;
}
//当剩下的元素个数不足时,剪枝
for(int i=startIndex;i<=9-(k-path.size())+1;i++)

代码

class Solution {
public:vector<int> path;vector<vector<int>> res;void backtracking(int k,int n,int startIndex,int sum){if(sum>n){return;}if(path.size()==k){if(sum==n) res.push_back(path);return;}for(int i=startIndex;i<=9-(k-path.size())+1;i++){path.push_back(i);sum+=i;backtracking(k,n,i+1,sum);sum-=i;path.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {backtracking(k,n,1,0);return res;}
};

17.电话号码的字母组合

力扣题目链接

思路

1. 数字和字母如何映射

  • 定义一个二维数组
const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9
};

2. 回溯模拟for循环

  • 遍历的深度是输入"23"的长度,遍历的宽度是字母集合,而叶子节点就是我们要收集的结果

代码

1. 我的写法

class Solution {
public:const string map[10]={"", //0"", //1"abc", //2"def", //3"ghi", //4"jkl", //5"mno", //6"pqrs", //7"tuv", //8"wxyz" //9};string path;vector<string> res;void backtracking(string digits,int startIndex){if(path.size()==digits.size()){res.push_back(path);return;}for(int i=startIndex;i<=digits.size()-1;i++){for(int j=0;j<map[digits[i]-'0'].size();j++){path.push_back(map[digits[i]-'0'][j]);backtracking(digits,i+1);path.pop_back();}}}vector<string> letterCombinations(string digits) {if(digits.size()==0) return res;backtracking(digits,0);return res;}
};

2. 代码随想录版

class Solution {
public:const string map[10]={"", //0"", //1"abc", //2"def", //3"ghi", //4"jkl", //5"mno", //6"pqrs", //7"tuv", //8"wxyz" //9};string s;vector<string> res;void backtracking(const string& digits,int index){ //index记录遍历到第几个数字if(index==digits.size()){res.push_back(s);return;}int digit=digits[index]-'0';string letter=map[digit];for(int i=0;i<letter.size();i++){//隐藏回溯:backtracking(digits, index + 1, s + letters[i]);s.push_back(letter[i]);backtracking(digits,index+1);s.pop_back();}}vector<string> letterCombinations(string digits) {if(digits.size()==0) return res;backtracking(digits,0);return res;}
};
  • 时间复杂度O(3^m+4^n),其中m是输入包括3个字母的数字个数,n是输入中包括4个字母的数字个数
  • 空间复杂度O(m+n)

3. 使用队列

参考力扣题解区

class Solution {
public:const string map[10]={"", //0"", //1"abc", //2"def", //3"ghi", //4"jkl", //5"mno", //6"pqrs", //7"tuv", //8"wxyz" //9};vector<string> res;vector<string> letterCombinations(string digits) {if(digits.size()==0) return res;queue<string> que;int digit=digits[0]-'0';string letter=map[digit];for(int i=0;i<letter.size();i++){string s;s=letter[i];que.push(s);}for(int i=1;i<digits.size();i++){int size=que.size();while(size--){string l=que.front();que.pop();digit=digits[i]-'0';letter=map[digit];for(int j=0;j<letter.size();j++){string ans=l+letter[j];que.push(ans);}}}while(!que.empty()){res.push_back(que.front());que.pop();}return res;}
};que.push(ans);}}}while(!que.empty()){res.push_back(que.front());que.pop();}return res;}
};

代码随想录算法训练营第25天|216.组合总和III,17.电话号码的字母组合相关推荐

  1. 代码随想录算法训练营第25天 | 216. 组合总和 III,17. 电话号码的字母组合

    代码随想录算法训练营第25天 | 216. 组合总和 III,17. 电话号码的字母组合 216. 组合总和 III 此题相比较于组合 多了一个求和的条件 就可以在终止条件中添加该条件判断 加一个变量 ...

  2. 代码随想录训练营第25天|216.组合总和 Ⅲ、17.电话号码的字母组合

    216.组合总和 Ⅲ.17.电话号码的字母组合 216.组合总和 Ⅲ 与总和问题相似,组合总和Ⅲ无非就是多了一个判断和的操作,因此,也会产生一些剪枝操作. 很显然,同组合一样,我们创建两个全部变量一维 ...

  3. 代码随想录第25天|216.组合总和III ● 17.电话号码的字母组合

    216.组合总和Ⅲ 回溯三部曲 确定递归函数参数 需要一维数组path来存放符合条件的结果,二维数组result来存放结果集. 接下来还需要如下参数: targetSum(int)目标和,也就是题目中 ...

  4. 代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合

    77组合 看完题后的思路 void f(数组,startIndex) 递归终止 if(startIndex数组长度||path.sizek){ if(path.size==k){ 加入} } 递归 f ...

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

    目录 LeeCode 216.组合总和III LeeCode 17.电话号码的字母组合 LeeCode 216.组合总和III 216. 组合总和 III - 力扣(LeetCode) 思路:本题和 ...

  6. 攻克代码随想录Day25 | 216. 组合总和 III | 17. 电话号码的字母组合

    216. 组合总和 III 在该题中,题目的整体思路与之前的77. 组合思路是相似的.但在本体中,我选择从1-9遍历每一种可能性.然后将与k相等的组合进行判定,若之和与n相等,则将其push进去,否则 ...

  7. 代码随想录第22天 | ● 216.组合总和III ● 17.电话号码的字母组合

    216.组合总和III /*** @param {number} k* @param {number} n* @return {number[][]}*/ let path = []; let roa ...

  8. LeetCode 216组合总和III 17电话号码的字母组合

    文章目录 216组合总和III c++ 代码实现 python 代码实现 17.电话号码的字母组合 c++ 代码实现 python代码实现 216组合总和III 找出所有相加之和为 n 的 k 个数的 ...

  9. day29 | 216.组合总和III 17.电话号码的字母组合

    文章目录 216.组合总和III 1.代码(AC) 2.分析 17.电话号码的字母组合 1.代码 2.分析 216.组合总和III 1.代码(AC) class Solution {List<L ...

最新文章

  1. [脑图]如何入门技术、进阶技术(技术开发人员)
  2. 数据增强 transform_深度学习-Pytorch框架学习之数据处理篇
  3. Oracle 性能优化之内核的shmall 和shmmax 参数
  4. 大咖面对面 | 陈果果博士谈智能语音
  5. 奋战杭电ACM(DAY10)1015
  6. mysql5.5二进制安装,mysql5.5.28 通用二进制安装
  7. c语言文件操作rewand,C语言程序设计第章概述.ppt
  8. Hello CTP(二)——CTP简介
  9. ubuntu ffmpeg 录制系统音频
  10. c语言键盘符号大全,求c语言各种符号 并且意义。。在键盘上没有的 如何打?...
  11. 【RegNet】《Designing Network Design Spaces》
  12. css3绘制的钢琴代码
  13. 强化学习 V.S. 自然语言处理,计算机保研er应该选哪个?
  14. c语言里主函数指什么,C语言里的主函数是什么
  15. 计算机架构宗师Patterson与Hennessy 演讲实录,ISA指令集架构回顾——未来指令集架构方向,RISC-V与DSA
  16. 深入探索Android布局优化(上)
  17. 网站另类推广玩法心得
  18. 2016年中国智能手机市场发展趋势研究
  19. 邮件内容以html形式,如何以邮件的形式发送HTML文件?
  20. PHP 实现阿里云短信API对接(登录/注册参考)

热门文章

  1. java中异常输出:e.toString() 与 e.getMessage()的区别
  2. 军校空军士官计算机专业,军校分不够,没关系!18所士官学校报考名单来袭!...
  3. Jquery加载动画
  4. 智能园区中计算机网络结构分为哪三层,.第3章 智能化建筑内计算机网络.ppt
  5. Oracle 快速入门 触发器游标
  6. runtime error: reference binding to null pointer of type ‘int‘ 问题
  7. 2021年中秋国庆假期安排表新鲜出炉!这些你一定要知道
  8. 南通大学信息科学技术学院818数字系统原理与设计真题分布情况
  9. linux 捕获sigsegv信息如何生成core文件,Linux下如何捕获SIGSEGV 的发生位置
  10. 2023年7月14日,ArrayList底层