代码随想录算法训练营第25天|216.组合总和III,17.电话号码的字母组合
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.电话号码的字母组合相关推荐
- 代码随想录算法训练营第25天 | 216. 组合总和 III,17. 电话号码的字母组合
代码随想录算法训练营第25天 | 216. 组合总和 III,17. 电话号码的字母组合 216. 组合总和 III 此题相比较于组合 多了一个求和的条件 就可以在终止条件中添加该条件判断 加一个变量 ...
- 代码随想录训练营第25天|216.组合总和 Ⅲ、17.电话号码的字母组合
216.组合总和 Ⅲ.17.电话号码的字母组合 216.组合总和 Ⅲ 与总和问题相似,组合总和Ⅲ无非就是多了一个判断和的操作,因此,也会产生一些剪枝操作. 很显然,同组合一样,我们创建两个全部变量一维 ...
- 代码随想录第25天|216.组合总和III ● 17.电话号码的字母组合
216.组合总和Ⅲ 回溯三部曲 确定递归函数参数 需要一维数组path来存放符合条件的结果,二维数组result来存放结果集. 接下来还需要如下参数: targetSum(int)目标和,也就是题目中 ...
- 代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合
77组合 看完题后的思路 void f(数组,startIndex) 递归终止 if(startIndex数组长度||path.sizek){ if(path.size==k){ 加入} } 递归 f ...
- 代码随想录算法训练营第二十五天|216.组合总和III 17.电话号码的字母组合
目录 LeeCode 216.组合总和III LeeCode 17.电话号码的字母组合 LeeCode 216.组合总和III 216. 组合总和 III - 力扣(LeetCode) 思路:本题和 ...
- 攻克代码随想录Day25 | 216. 组合总和 III | 17. 电话号码的字母组合
216. 组合总和 III 在该题中,题目的整体思路与之前的77. 组合思路是相似的.但在本体中,我选择从1-9遍历每一种可能性.然后将与k相等的组合进行判定,若之和与n相等,则将其push进去,否则 ...
- 代码随想录第22天 | ● 216.组合总和III ● 17.电话号码的字母组合
216.组合总和III /*** @param {number} k* @param {number} n* @return {number[][]}*/ let path = []; let roa ...
- LeetCode 216组合总和III 17电话号码的字母组合
文章目录 216组合总和III c++ 代码实现 python 代码实现 17.电话号码的字母组合 c++ 代码实现 python代码实现 216组合总和III 找出所有相加之和为 n 的 k 个数的 ...
- day29 | 216.组合总和III 17.电话号码的字母组合
文章目录 216.组合总和III 1.代码(AC) 2.分析 17.电话号码的字母组合 1.代码 2.分析 216.组合总和III 1.代码(AC) class Solution {List<L ...
最新文章
- [脑图]如何入门技术、进阶技术(技术开发人员)
- 数据增强 transform_深度学习-Pytorch框架学习之数据处理篇
- Oracle 性能优化之内核的shmall 和shmmax 参数
- 大咖面对面 | 陈果果博士谈智能语音
- 奋战杭电ACM(DAY10)1015
- mysql5.5二进制安装,mysql5.5.28 通用二进制安装
- c语言文件操作rewand,C语言程序设计第章概述.ppt
- Hello CTP(二)——CTP简介
- ubuntu ffmpeg 录制系统音频
- c语言键盘符号大全,求c语言各种符号 并且意义。。在键盘上没有的 如何打?...
- 【RegNet】《Designing Network Design Spaces》
- css3绘制的钢琴代码
- 强化学习 V.S. 自然语言处理,计算机保研er应该选哪个?
- c语言里主函数指什么,C语言里的主函数是什么
- 计算机架构宗师Patterson与Hennessy 演讲实录,ISA指令集架构回顾——未来指令集架构方向,RISC-V与DSA
- 深入探索Android布局优化(上)
- 网站另类推广玩法心得
- 2016年中国智能手机市场发展趋势研究
- 邮件内容以html形式,如何以邮件的形式发送HTML文件?
- PHP 实现阿里云短信API对接(登录/注册参考)
热门文章
- java中异常输出:e.toString() 与 e.getMessage()的区别
- 军校空军士官计算机专业,军校分不够,没关系!18所士官学校报考名单来袭!...
- Jquery加载动画
- 智能园区中计算机网络结构分为哪三层,.第3章 智能化建筑内计算机网络.ppt
- Oracle 快速入门 触发器游标
- runtime error: reference binding to null pointer of type ‘int‘ 问题
- 2021年中秋国庆假期安排表新鲜出炉!这些你一定要知道
- 南通大学信息科学技术学院818数字系统原理与设计真题分布情况
- linux 捕获sigsegv信息如何生成core文件,Linux下如何捕获SIGSEGV 的发生位置
- 2023年7月14日,ArrayList底层