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

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

  • 216. 组合总和 III
    • 题目
    • 解法
  • 17. 电话号码的字母组合
    • 题目
    • 解法
  • 感悟

216. 组合总和 III

题目

在这里插入图片描述

解法

  1. 修改上一天组合的代码
class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(int n, int k, int sum_n, int startIdx) {// 终止条件if (path.size() == k) {int sum = 0;for (int i = 0; i < path.size(); i++) {sum += path[i];}if(sum == sum_n) result.push_back(path);return;}for (int i = startIdx; i <= n-(k-path.size())+1; i++) { // 剪枝优化path.push_back(i); // 处理的节点backtracking(n, k, sum_n, i+1);path.pop_back(); // 回溯,撤销处理的节点}return ;}vector<vector<int>> combinationSum3(int k, int n) {backtracking(9, k, n, 1);return result;}
};

2.看过题解之后的简化:减低时间复杂度、优化剪枝

class Solution {
public:vector<vector<int>> result;vector<int> path;void backtracking(int sum, int k, int sum_n, int startIdx) {if (sum > sum_n) return; //剪枝// 终止条件if (path.size() == k) {// int sum = 0;// for (int i = 0; i < path.size(); i++) { // 减去时间复杂度//     sum += path[i];// }if(sum == sum_n) result.push_back(path);return;}for (int i = startIdx; i <= 9-(k-path.size())+1; i++) { // 剪枝优化sum += i;path.push_back(i); // 处理的节点backtracking(sum, k, sum_n, i+1);path.pop_back(); // 回溯,撤销处理的节点sum -= i;}return ;}vector<vector<int>> combinationSum3(int k, int n) {result.clear();path.clear();backtracking(0, k, n, 1);return result;}
};

17. 电话号码的字母组合

题目

在这里插入图片描述

解法

  1. 自己解法:按照昨天代码进行改进,代码不够简洁
class Solution {
public:vector<string> result;string path;void backtracking(string digits, int startIdx) {if(path.size() == digits.size()) {result.push_back(path);return ;}for(int i = startIdx; i < digits.size(); i++) {if(digits[i] == '2'){path += 'a';backtracking(digits, i+1);path.pop_back();path += "b";backtracking(digits, i+1);path.pop_back();path += "c";backtracking(digits, i+1);path.pop_back();}else if(digits[i] == '3'){path += "d";backtracking(digits, i+1);path.pop_back();path += "e";backtracking(digits, i+1);path.pop_back();path += "f";backtracking(digits, i+1);path.pop_back();}else if(digits[i] == '4'){path += "g";backtracking(digits, i+1);path.pop_back();path += "h";backtracking(digits, i+1);path.pop_back();path += "i";backtracking(digits, i+1);path.pop_back();}else if(digits[i] == '5'){path += "j";backtracking(digits, i+1);path.pop_back();path += "k";backtracking(digits, i+1);path.pop_back();path += "l";backtracking(digits, i+1);path.pop_back();}else if(digits[i] == '6'){path += "m";backtracking(digits, i+1);path.pop_back();path += "n";backtracking(digits, i+1);path.pop_back();path += "o";backtracking(digits, i+1);path.pop_back();}else if(digits[i] == '7'){path += "p";backtracking(digits, i+1);path.pop_back();path += "q";backtracking(digits, i+1);path.pop_back();path += "r";backtracking(digits, i+1);path.pop_back();path += "s";backtracking(digits, i+1);path.pop_back();}else if(digits[i] == '8'){path += "t";backtracking(digits, i+1);path.pop_back();path += "u";backtracking(digits, i+1);path.pop_back();path += "v";backtracking(digits, i+1);path.pop_back();}else if(digits[i] == '9'){path += "w";backtracking(digits, i+1);path.pop_back();path += "x";backtracking(digits, i+1);path.pop_back();path += "y";backtracking(digits, i+1);path.pop_back();path += "z";backtracking(digits, i+1);path.pop_back();}}return ;}vector<string> letterCombinations(string digits) {result.clear();path.clear();if(digits.empty()) return result;backtracking(digits, 0);return result;}
};

2.看完题解之后,代码优化

class Solution {
private:const string letterMap[10] = {  //减少代码量"",//0"",//1"abc",//2"def",//3"ghi",//4"jkl",//5"mno",//6"pqrs",//7"tuv",//8"wxyz",//9};
public:vector<string> result;string path;void backtracking(const string& digits, int index) {if(index == digits.size()) {result.push_back(path);return ;}int id = digits[index] - '0';string letter = letterMap[id];for (int i = 0; i < letter.size(); i++) {path.push_back(letter[i]);backtracking(digits, index+1);path.pop_back();}return ;}vector<string> letterCombinations(string digits) {result.clear();path.clear();if(digits.empty()) return result;backtracking(digits, 0);return result;}
};

感悟

重复的代码可以通过规律固定下来,达到简化代码的效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/544773.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爆肝两千字!掌握CSS选择器与响应式设计:从基础到高级应用

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

计算机网络----计算机网络的基础

目录 一.计算机网络的相关概念 二.计算机网络的功能 三.计算机网络的发展 四.计算机网络的组成 五.计算机网络的分类 六.计算机的性能指标 1.速率 2.带宽 3.吞吐量 4.时延 5.时延带宽积 6.往返时延RTT 7.利用率 七.计算机的分层结构 八.ISO/OSI参考模型 九.OSI…

【JAVA基础】算法与集合

1 查找 1.1 二分查找 public class Main {public static void main(String[] args) throws IOException, CloneNotSupportedException, ParseException { //数组必须有序int[] arr{1,2,4,5,6,24,123};System.out.println(binarySearch(arr,123));//6}public static int bina…

java数据结构与算法刷题-----LeetCode376. 摆动序列

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 贪心2. 动态规划3. 优化版动态规划 1. 贪心 解题思路&#x…

ArcGIS分享图层数据的最佳方法

在工作中&#xff0c;经常需要将图层数据分享给其他人。 如下图所示&#xff0c;需要分享的是【CJDCQ】和【GHDLTB】&#xff0c;图层带有符号系统&#xff1a; 一、分享gdb数据库及lyr文件 分享数据自然要找到源数据&#xff1a; 但是&#xff0c;gdb数据是不带符号系统的&a…

接口幂等性问题和常见解决方案

接口幂等性问题和常见解决方案 1.什么是接口幂等性问题1.1 会产生接口幂等性的问题1.2 解决思路 2.接口幂等性的解决方案2.1 唯一索引解决方案2.2 乐观锁解决方案2.3 分布式锁解决方案2.4 Token解决方案(最优方案) 1.什么是接口幂等性问题 幂等性: 用户同一操作发起的一次或多…

JMeter 面试题及答案整理,最新面试题

JMeter中如何进行性能测试的规划和设计&#xff1f; 进行JMeter性能测试的规划和设计主要遵循以下几个步骤&#xff1a; 1、确定测试目标&#xff1a; 明确性能测试的目的和目标&#xff0c;比如确定要测试的系统性能指标&#xff08;如响应时间、吞吐量、并发用户数等&#…

html编辑器

HTML 编辑器推荐 html可以使用记事本编辑 但是更建议使用专业的 HTML 编辑器来编辑 HTML&#xff0c;我在这里给大家推荐几款常用的编辑器&#xff1a; VS Code&#xff1a;https://code.visualstudio.com/WebStorm: https://www.jetbrains.com/webstorm/Notepad: https://no…

Golang协程详解

一.协程的引入 1.通过案例文章引入并发,协程概念 见:[go学习笔记.第十四章.协程和管道] 1.协程的引入,调度模型&#xff0c;协程资源竞争问题 通过上面文章可以总结出Go并发编程原理: 在一个处理进程中通过关键字 go 启用多个协程&#xff0c;然后在不同的协程中完成不同的子任…

紫色星空月亮404网页模板源码

紫色星空月亮404网页模板源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 源码下载 紫色星空月亮404网页模板源码

【网络】负载均衡

OSI模型每一层的负载均衡 在OSI模型中&#xff0c;每一层的负载均衡具体如下&#xff1a; 1. 第二层&#xff08;数据链路层&#xff09;&#xff1a;数据链路层的负载均衡通常涉及对MAC地址的操作。在这一层&#xff0c;可以使用虚拟MAC地址技术&#xff0c;外部设备对虚拟MA…

专升本 C语言笔记-07 逗号运算符

1.逗号表达式的用法 就是用逗号隔开的多个表达式。逗号表达式&#xff0c;从左向右依次执行。 2.逗号表达式的特性 2.1.当没有括号时&#xff0c;第一个表达式为整个表达式的值。 代码 int x 3,y 5,a 0; a x,y; printf("a %d",a); 说明:因为逗号优先级最低,会…