DAY25:回溯算法组合题216、17

Leetcode: 216 组合总和III

经过了昨天组合的题目的学习,这道题比较简单,套用之前的模板就可以

基本思路

  • 终止条件,遇到向量的个数一样,并且sum等于n的时候终止。
  • 输入变量,n,k,还有起始的idx和基于当前元素之和的sum
  • 逻辑就是,按照循环递归下去,注意要对sum值进行回溯。

时间复杂度O(n * 2^n)

空间复杂度O(N)

class Solution {
private:vector<vector<int>> result;vector<int> vec;void traceback(int k, int n, int idx, int sum){if(vec.size() == k && sum == n){result.push_back(vec);return;}for(int i = idx; i <= 9; i++){vec.push_back(i);sum += i;//计算当前元素之和traceback(k, n, i+1, sum);//进行递归sum -= i;//注意sum值的回溯vec.pop_back();}}
public:vector<vector<int>> combinationSum3(int k, int n) {traceback(k, n, 1, 0);return result;}
};

减枝优化

1、每个数值的取值范围为1-9,与上题一样的剪枝操作。2、当所有元素之和已经大于n的时候后续就不需要进行递归了。

for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i++) { // 剪枝sum += i; // 处理path.push_back(i); // 处理if (sum > targetSum) { // 剪枝操作sum -= i; // 剪枝之前先把回溯做了path.pop_back(); // 剪枝之前先把回溯做了return;}backtracking(targetSum, k, sum, i + 1); // 注意i+1调整startIndexsum -= i; // 回溯path.pop_back(); // 回溯
}

Leetcode: 17 电话号码的字母组合

字母和数字的映射

需要先定义一个二维数组来存放映射关系。

const string letterMap[10] = {"", // 0"", // 1"abc", // 2"def", // 3"ghi", // 4"jkl", // 5"mno", // 6"pqrs", // 7"tuv", // 8"wxyz", // 9
};

基本思路

  • 输入:要求的digit和定义一个idx来记录目前遍历到哪个数字了。
  • 终止条件,当遍历的数字和digit长度一样的时候。
  • 遍历逻辑:首先要取index指向的数字,并找到对应的字符集(手机键盘的字符集)。
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 str;void traceback(string digits, int idx){if(idx == digits.size()){result.push_back(str);return;}int digit = digits[idx] - '0';        // 将idx指向的数字转为intstring letters = letterMap[digit];      // 取数字对应的字符集for (int i = 0; i < letters.size(); i++) {str.push_back(letters[i]);            // 处理traceback(digits, idx + 1);    // 递归,注意index+1,一下层要处理下一个数字了str.pop_back();                       // 回溯}}vector<string> letterCombinations(string digits) {if (digits.size() == 0) {return result;}traceback(digits, 0);return result;}
};

本题的难点主要在于1、字母表和数字的映射建立和相互转换 2、递归逻辑的梳理

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

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

相关文章

2024.1.19

今天狠狠地复习了一下C语言&#xff0c;不复习不知道&#xff0c;一复习吓一跳昂&#xff0c;这感觉好多都忘却了&#xff0c;这并非一件好事&#xff0c;所以说还好复习了&#xff0c;不然考试就有点问题了&#xff0c;但是还好写一下这些代码就马上想起来了&#xff0c;所以说…

如何快速申请GPT账号?

详情点击链接&#xff1a;如何快速申请GPT账号&#xff1f;​​​​​​​ 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude…

search——Bloom Filter

详情&#xff0c;看这一篇博客 package mainimport ("fmt""math""strconv" )type BloomFilter struct {*bitMapk uint64 // hash function countm uint64 // bits array lengthn uint64 // insert n numberp float64 //…

递归组件怎么实现无线滚动

递归组件实现无限滚动的方法通常涉及到对数据的递归处理和组件的自我调用。以下是一个简单的示例&#xff0c;展示如何使用递归组件实现无限滚动&#xff1a; 首先&#xff0c;定义一个递归组件&#xff0c;该组件可以调用自己来渲染下一组数据。假设我们要展示一个滚动列表&a…

什么是vue的sync语法糖如何使用

Vue的sync语法糖是用于实现子组件修改父组件数据的双向绑定。在Vue中&#xff0c;默认是单向数据流&#xff0c;子组件不能直接修改父组件的数据。但是有些情况下&#xff0c;我们需要子组件能够修改父组件的数据&#xff0c;这时就可以使用sync语法糖。 使用sync语法糖的步骤…

第11章 GUI Page500~504 步骤三十二:打开画板文件02

各个图元类新增GetTypeName_Static()&#xff0c;并将原来的GetTypeName()改为调用静态方法实现&#xff1a; 直线&#xff1a; 圆&#xff1a; 十字&#xff1a; 矩形&#xff1a; 文字&#xff1a; tool_4_save_load.hpp添加两行 tool_4_save_load.cpp增加&#xff1a; 增加…

网络安全产品之认识入侵检测系统

随着计算机网络技术的快速发展和网络攻击的不断增多&#xff0c;单纯的防火墙策略已经无法满足对安全高度敏感的部门的需要&#xff0c;网络的防卫必须采用一种纵深的、多样的手段。因此&#xff0c;入侵检测系统作为新一代安全保障技术&#xff0c;成为了传统安全防护措施的必…

【资治通鉴】古代纪年法 ( 天干地支纪年法 | 木星纪年法 | 太岁纪年法 | 星次 | 天球 | 黄道带 | 四象二十八星宿 )

文章目录 一、天干地支纪年法二、木星纪年法1、星次2、天球3、黄道带 三、太岁纪年法四、四象二十八星宿1、四象与二十八星宿关联2、二十八星宿与星次关联3、西游记中的二十八星宿 2024 年 使用 天干地支纪年法是 甲辰年 , 使用 太岁纪年法是 阏逢执徐 ; 一、天干地支纪年法 天…

c 宏转字符串与拼接

C 用宏可以转字符串与拼接字符。 举例 #include <stdio.h> #define CON(a) (B##a) //concatenate #define STR

vim常见命令

目录 快捷键 常用命令 快捷键 i 切换插入模式 esc 退出插入模式 p 粘贴 常用命令 命令作用:q退出 vim 编辑器:q!不保存文件&#xff0c;直接退出 vim 编辑器:w只保存文件&#xff0c;但不退出 vim 编辑器:wq保存文件且退出 vim 编辑器ZZ保存文件且退出 vim 编辑器:start,…

建筑能源管理系统

建筑能源管理系统是一种集成了先进的监测、控制、分析和优化技术的智能化系统&#xff0c;旨在提高建筑能源效率&#xff0c;降低能源消耗&#xff0c;减少环境污染&#xff0c;并为用户提供舒适、安全的建筑环境。通过监测建筑内的各种能源消耗情况&#xff0c;如电力、热水、…

arthas(阿尔萨斯)日常java代码调优使用命令

官方项目文档&#xff1a;https://gitee.com/arthas/arthas &#xff08;最权威的教学还是得官网&#xff0c;这里仅作简单记录&#xff09; 1&#xff1a;启动 java -jar arthas-boot.jar 2&#xff1a;查看cpu占用排名前三 thread -3 3&#xff1a;查看指定id thread 203 4:查…

数据结构day1

1.思维导图 2.定义一个简单宏或宏函数&#xff0c;实现两个数交换。 3.定义字符类型指针&#xff0c;指针指向n个连续堆区内存&#xff0c;输入&#xff0c;计算字符串长度 定义函数&#xff0c;实现内存申请 定义函数&#xff0c;解释字符串长度 定义函数&#xff0c;释放内…

ACEeditor使用手册(一)

文章目录 ACEeditor使用手册引言简介ACEeditorACEeditor的应用场景为什么选择ACEeditor 1. ACEeditor基础1.1 安装与配置通过CDN引入使用npm/yarn安装配置基本选项 1.2 创建一个简单的编辑器在HTML中创建容器元素初始化ACEeditor实例 1.3 主题与样式内置主题列表自定义主题样式…

河南文旅火爆出圈,来了解小魔推短视频矩阵的魅力!

最近几天四川文旅的抖音账号&#xff0c;1天发视频六十多条&#xff0c;增长粉丝20w&#xff0c;另外河北文旅抖音账号&#xff0c;一天发视频七十多条&#xff0c;增长粉丝30w&#xff0c;更有河南文旅抖音账号&#xff0c;单日发布上百条视频&#xff0c;实现涨粉15w&#xf…

最长上升子序列模型(LIS)

最长上升子序列模型就像它的名字一样&#xff0c;用来从区间中找出最长上升的子序列。它主要用来处理区间中的挑选问题&#xff0c;可以处理上升序列也可以处理下降序列&#xff0c;原序列本身的顺序并不重要。 模型 895. 最长上升子序列&#xff08;活动 - AcWing&#xff0…

代码随想录算法训练营第六天| 242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和

目录 242 有效的字母异位词 349 两个数组的交集 202 快乐数 1 两数之和 242 有效的字母异位词 排序 class Solution { public:bool isAnagram(string s, string t) {sort(s.begin(),s.end());sort(t.begin(),t.end());return t s;} }; 时间复杂度O(nlogn) 空间复杂度O(l…

Apache Flink 1.15正式发布

Apache Flink 核心概念之一是流 (无界数据) 批 (有界数据) 一体。 流批一体极大的降低了流批融合作业的开发复杂度。在过去的几个版本中&#xff0c;Flink 流批一体逐渐成熟&#xff0c;Flink 1.15 版本中流批一体更加完善&#xff0c;后面我们也将继续推动这一方向的进展。目…

mysql原理--事务的隔离级别与 MVCC

1.事前准备 为了故事的顺利发展&#xff0c;我们需要创建一个表&#xff1a; CREATE TABLE hero (number INT,name VARCHAR(100),country varchar(100),PRIMARY KEY (number) ) EngineInnoDB CHARSETutf8;然后向这个表里插入一条数据&#xff1a;INSERT INTO hero VALUES(1, 刘…

Nginx笔记

安装Nginx docker pull nginx # 下载nginx docker run \ --name nginx \ -p 80:80 \ -d \ nginx # 测试容器的运行 mkdir -p /data/nginx/conf mkdir -p /data/nginx/www mkdir -p /data/nginx/logs docker cp nginx:/etc/nginx/nginx.conf /data/nginx docker cp nginx:/e…