代码随想录算法训练营第二十五天 | 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://xiahunao.cn/news/2869199.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Mr-Robot1靶场练习靶场推荐小白入门练习靶场渗透靶场bp爆破wordpress

下载链接&#xff1a; Mr-Robot: 1 ~ VulnHub 安装&#xff1a; 打开vxbox&#xff0c;菜单栏----管理----导入虚拟电脑 选择下载完的ova文件&#xff0c;并修改想要保存的位置&#xff08;也可以保持默认位置&#xff09; 导入完成后可以根据自己的情况去配置网络链接方式 完成…

SQLiteC/C++接口详细介绍之sqlite3类(十二)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十一&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十三&#xff09; ​37.sqlite3_load_extension 用于在SQLit…

类C语言实现顺序表中的基本操作

自己在学习数据结构中(DS)写得程序&#xff0c;和大家一起分享&#xff0c;可能存在不足和缺漏的地方&#xff0c;感谢大家的指正和理解。 首先是一些变量的声明&#xff08;typedef&#xff09;&#xff0c;然后是定义顺序表的类型&#xff08;里面含有数组&#xff08;存储数…

重读 Java 设计模式: 深入探讨工厂模式,创建对象的灵活性与可维护性

引言 今天我们来继续学习创建型设计模式中的工厂模式。在软件开发中&#xff0c;工厂模式是一种常见的设计模式&#xff0c;旨在提供一种灵活、可扩展的方式来创建对象实例。工厂模式通常分为简单工厂模式和抽象工厂模式两种主要形式&#xff0c;它们在不同情境下各具优势&…

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

Jenkins中如何实现持续集成与持续部署&#xff1f; Jenkins通过自动化构建、测试和部署应用程序来实现持续集成与持续部署&#xff08;CI/CD&#xff09;。这个过程包括以下步骤&#xff1a; 1、源代码管理&#xff1a; Jenkins支持与多种版本控制系统集成&#xff0c;如Git、…

路由器端口转发远程桌面控制:一电脑连接不同局域网的另一电脑

一、引言 路由器端口转发&#xff1a;指在路由器上设置一定的规则&#xff0c;将外部的数据包转发到内部指定的设备或应用程序。这通常需要对路由器进行一些配置&#xff0c;以允许外部网络访问内部网络中的特定服务和设备。端口转发功能可以实现多种应用场景&#xff0c;例如远…

考研C语言复习进阶(6)

目录 1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境 ​编辑​编辑 2.2 编译本身也分为几个阶段&#xff1a; 2.3 运行环境 3. 预处理详解 3.1 预定义符号 3.2 #define 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 2.2.3 #define 替换规则 3.2.4…

Ubuntu 如何安装 Beyond Compare?

Ubuntu20.04安装Beyond Compare 4.3.7 一、官网下载方式一&#xff1a;方法二&#xff1a;使用 .deb 包安装 二、安装相关依赖和bcompare三、破解常见错误解决方法 ) 文件比较工具Beyond Compare是一套由Scooter Software推出的文件比较工具。主要用途是对比两个文件夹或者文件…

【大模型系列】问答理解定位(Qwen-VL/Llama2/GPT)

文章目录 1 Qwen-VL(2023, Alibaba)1.1 网络结构1.2 模型训练 2 Llama2(2023, Meta)2.1 网络结构2.1.1 MHA/GQA/MQA2.1.2 RoPE(Rotary Position Embedding, 旋转式位置编码)2.1.3 RMSNorm 2.2 推理2.2.1 集束搜索(beam search)2.2.2 RoPE外推 3 GPT系列(OpenAI) 1 Qwen-VL(2023…

贪心算法(两个实例)

例一&#xff1a;调度问题 问题&#xff1a;由n项任务&#xff0c;每项任务的加工时间已知&#xff0c;从零时刻开始陆续加入一台机器上去加工&#xff0c;每个任务完成的时间是从0时刻到任务加工截至的时间。 求总完成时间&#xff08;所有任务完成时间最短计划方案&#xf…

vue3新功能-Teleport

1.teleport 在组件内的任何位置渲染内容 将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 例:将组件dialog添加到body下面 <teleport to"body"> <el- dialog --> </teleport> 2.fragments 多个根元素外层不需要…

解决Linux中Eclipse启动时找不到Java环境的问题

按照报错的意思是没有在/usr/local/eclipse/jre/bin/java下找到java环境&#xff0c;我检查了一下eclipse的目录结构发现在/usr/local/eclipse没有jre/bin/java&#xff0c;我的想法是自己建对应文件夹然后软连接到我的java环境 cd /usr/local/eclipse sudo mkdir jre cd jre s…

CSS其他属性

文章目录 1. vertical-align1.1. 概念1.2. 常用值1.3. 作用1.4. 出现的情况一1.4.1. 原因1.4.2. 解决方案 1.5. 出现情况二1.5.1. 解决方案一1.5.2. 解决方案二1.5.3. 解决方案三 1.6. 出现情况三1.6.1. 原因1.6.2. 解决方案 2. 溢出效果2.1. 作用2.2. 属性名 3. 隐藏效果3.1. …

软考78-上午题-【面向对象技术3-设计模式】-结构型设计模式01

一、适配器模式 1-1、意图 个类的接口转换成客户希望的另外一个接口。 Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 1-2、结构 适配器模式分为&#xff1a; 1、适配器类模式&#xff1b; 2、适配器对象模式 类适配器使用多重继承对一个接口与另…

Spring Cloud Alibaba微服务从入门到进阶(五)(负载均衡-Ribbon)

负载均衡有两种形式&#xff0c;服务器端负载均衡/客户端负载均衡 1、服务器端负载均衡 因为Nginx是部署在服务器端的&#xff0c;所以用Nginx实现的负载均衡被称为服务器端负载均衡 2、客户端负载均衡 手写一个客户端侧负载均衡器 使用Ribbon实现负载均衡 Ribbon是Netflix…

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

GitLab 在持续集成/持续部署(CI/CD)中的角色是什么&#xff1f; GitLab 在持续集成/持续部署(CI/CD)中扮演的角色非常关键&#xff0c;主要体现在以下几个方面&#xff1a; 1、自动化构建和测试&#xff1a; GitLab 可以自动化执行代码的构建和测试过程&#xff0c;确保代码提…

[自研开源] MyData 数据集成之数据过滤 v0.7.2

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 概述 本篇基于…

生态系统服务——食物生产功能分布数据

食物生产数据为县生态系统提供的粮食、水产品、肉类、林果产品等食物产量&#xff0c;统一转换为能量。 地理遥感生态网提供的生态系统服务——食物生产功能分布数据&#xff0c;计算中以县为单元对各种粮食、肉、蛋、奶、水果产量进行核算。其中&#xff0c;食物供给功…

实战:django项目环境搭建(pycharm,virtualBox)

django项目环境搭建 一.创建虚拟环境二.创建PyCharm远程连接 一.创建虚拟环境 需要用到的软件&#xff1a;PyCharm&#xff0c;VirtualBox虚拟机。 1.打开虚拟机终端&#xff0c;创建新的虚拟环境 Book。 2.在虚拟环境中创建新的文件夹 library&#xff0c;cd命令进入该文件…

《操作系统导论》第二章读书笔记

《操作系统导论》第二章读书笔记 —— 杭州 2024-03-17 夜 文章目录 《操作系统导论》第二章读书笔记1.操作系统&#xff08;Operating System&#xff0c;OS&#xff09;2.虚拟化CPU3.虚拟化内存4.并发5.持久性6.设计目标和简单历史 1.操作系统&#xff08;Operating System&a…