算法打卡day22|回溯法篇02|Leetcode 216.组合总和III、17.电话号码的字母组合

 算法题

Leetcode 216.组合总和III

题目链接:216.组合总和III

大佬视频讲解:组合总和III视频讲解

 个人思路

在昨日做过的组合问题后,这道题的限制 多了两个:1.要找到和为n的k个数的组合,2.整个集合已经是固定的了[1,...,9],依然用回溯法解决,只是找寻结果的条件不同。

解法
回溯法

把改题抽象为如下树形结构

再跟上

回溯法三部曲

1.确定递归函数参数

定义一个一维数组path来存放符合条件的结果,一个二维数组result来存放结果集。再定义path(结果路径) 和 result为全局变量。

回溯法中需要如下参数:

  • targetSum(int)目标和,也就是题目中的n。
  • k(int)就是题目中要求k个数的集合。
  • sum(int)为已经收集的元素的总和,也就是path里元素的总和。
  • startIndex(int)为下一层for循环搜索的起始位置。

强调:回溯法中递归函数参数很难一次性确定下来,一般先写逻辑,需要啥参数了,填什么参数

2.确定终止条件

首先k其实就已经限制树的深度,因为就取k个元素,树再往下深了没有意义。所以如果path.size() 和 k相等了,就终止。如果此时path里收集到的元素和(sum) 和targetSum(就是题目描述的n)相同了,就用result收集当前的结果

3.单层搜索过程

集合固定的就是9个数[1,...,9],所以for循环固定i<=9

处理过程:path收集每次选取的元素,相当于树型结构里的边,sum来统计path里元素的总和

最后,要注意:处理过程 和 回溯过程是一一对应的,处理有加,回溯就要有减!

搞定完回溯法,再做一下剪枝优化

按题意,已选元素总和如果已经大于n(图中数值为4)了,那么往后遍历就没有意义了直接剪掉

class Solution {LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> ans = new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {build(k, n, 1, 0);return ans;}private void build(int k, int n, int startIndex, int sum) {if (sum > n) return;//剪枝 剪去和大于目标值的结果if (path.size() > k) return;//剪枝  剪去超过结果集个数的遍历//相当于for循环中的这个剪枝:i <= 9 - (k - path.size()) + 1; if (sum == n && path.size() == k) {//符合条件就收集结果ans.add(new ArrayList<>(path));return;}for(int i = startIndex; i <= 9; i++) {path.add(i);sum += i;build(k, n, i + 1, sum);//递归sum -= i;//回溯path.removeLast();//回溯}}
}

时间复杂度:O(n * 2^n));(循环n个元素,2^n表示所有可能的子集数量)

空间复杂度:O(n);(递归栈的深度最多为 n)


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

题目链接:17.电话号码的字母组合

大佬视频讲解:电话号码的字母组合视频讲解

个人思路

虽然题目也类似于组合,但最多可以有4重循环,思路打结...

解法
回溯法

把组合问题抽象为如下树形结构

如上图,可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是要收集的结果

回溯法三部曲

1.确定回溯函数参数

首先需要一个字符串s收集叶子节点的结果,然后用一个字符串数组result保存起来,

参数指定是有题目中给的string digits,然后还要有一个参数就是int型的index。

这个index是记录遍历第几个数字,就是用来遍历digits的(题目中给出数字字符串),同时index也表示树的深度。

2.确定终止条件

终止条件就是index 等于 输入的数字个数(digits.size),然后收集结果,结束本层递归。

3.确定单层遍历逻辑

首先要取index指向的数字,并找到对应的字符集(手机键盘的字符集)。

然后for循环来处理这个字符集,注意本题每一个数字代表的是不同集合,也就是求不同集合之间的组合;还有需要注意输入1 * #按键等等异常情况

关于剪枝,这道题没有其他条件,是在求取不同集合之间的组合,所以没有可以剪枝的地方。

class Solution {List<String> list = new ArrayList<>();//结果列表public List<String> letterCombinations(String digits) {if (digits == null || digits.length() == 0) {return list;}//初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串""String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};backTracking(digits, numString, 0);return list;}//每次递归获取一个字符串,所以会涉及大量的字符串拼接,因此选择更为高效的 StringBuildStringBuilder temp = new StringBuilder();public void backTracking(String digits, String[] numString, int num) {//遍历全部,记录一次得到的字符串if (num == digits.length()) {//终止条件list.add(temp.toString());return;}//str 表示当前num对应的字符串//比如digits如果为"23",num 为0,则str表示2对应的 abcString str = numString[digits.charAt(num) - '0'];for (int i = 0; i < str.length(); i++) {temp.append(str.charAt(i));backTracking(digits, numString, num + 1);temp.deleteCharAt(temp.length() - 1);//回溯,剔除末尾的元素继续尝试}}
}

时间复杂度:O(3^m * 4^n);(粗略估算,其中 m 是对应四个字母的数字个数,n 是对应三个字母的数字个数)

空间复杂度:O(3^m * 4^n);(需要暂存结果大小)


 以上是个人的思考反思与总结,若只想根据系列题刷,参考卡哥的网址代码随想录算法官网

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

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

相关文章

用Python直接获取Word文档页数、字数、段落数、节数等信息

计算 Word 文档的页数、字数等信息是出版、学术和内容管理等领域的一项基本任务。准确的页数和字数对于评估文档长度、估算印刷成本、分析文本复杂性以及确保符合格式化指南至关重要。逐个预览文档查看相关信息是非常麻烦的事情&#xff0c;我们可以在不预览文档的情况下&#…

分享一篇Oracle RAC实战安装11G

分享一次很久以前的Oracle rac项目实施。 1、拓扑结构 基础环境是2台H3C的服务器2台3PAR的双活存储&#xff0c;操作系统centos7.2。借用下别人家的拓扑先&#xff08;这是一套典型的RAC架构&#xff09;。 2、网卡TEAM操作 以eno51和en052组成Team1组为示例&#xff1a; nm…

第十二届蓝桥杯大赛软件赛决赛C/C++ 研究生组-纯质数

直接判断数据过大 相对而言&#xff0c;由2&#xff0c;3&#xff0c;5&#xff0c;7组成的数更少&#xff0c;则先筛选出由2,3,5,7组成的数&#xff0c;再判断这些数中的质数个数即可 #include <iostream> using namespace std; int main() {printf("1903");…

3.7 RK3399项目开发实录-板载OpenWRT系统的使用(wulianjishu666)

STM32F103单片机从零到项目开发程序实例 下载链接&#xff1a;https://pan.baidu.com/s/1dWNskNinrMk4bxaE-jgHhQ?pwdymn3 1. OpenWRT 手册 1.1. 支持设备列表 主控板卡型号RK3568ROC-RK3568-PC/Station-P2 1.2. 登录 IP 、登录密码和 WIFI 名称 固件默认登录 IP 为 192.1…

化妆品行业电商数据分析

随着互联网经济的高速发展&#xff0c;电商已经成为化妆品经营的主要渠道之一。根据网络数据显示&#xff0c;11月全国化妆品网络活跃商品200万&#xff0c;零售总额为400亿。分区域来看&#xff0c;上海市、广东省、浙江省化妆品行业网络零售突出&#xff0c;三个区域网络零售…

2024.3.9|第十五届蓝桥杯模拟赛(第三期)

2024.3.9|十五届蓝桥杯模拟赛&#xff08;第三期&#xff09; 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&…

webpack5零基础入门-10babel的使用

Babel JavaScript 编译器。 主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法&#xff0c;以便能够运行在当前和旧版本的浏览器或其他环境中 1.安装相关包 npm install -D babel-loader babel/core babel/preset-env 2.进行相关配置 2.1第一种写法是在webp…

聚类分析 | Matlab实现基于PCA+DBO+K-means的数据聚类可视化

聚类分析 | Matlab实现基于PCADBOK-means的数据聚类可视化 目录 聚类分析 | Matlab实现基于PCADBOK-means的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 PCA&#xff08;主成分分析&#xff09;、DBO&#xff08;蜣螂优化算法&#xff09;和K-means聚类…

正则表达式具体用法大全

# 正则表达式&#xff1a; ## 单字符匹配&#xff1a; python # 匹配某个字符串&#xff1a; # text "abc" # ret re.match(b,text) # print(ret.group()) # 点&#xff08;.&#xff09;&#xff1a;匹配任意的字符(除了\n)&#xff1a; # text "\nabc&quo…

输入框禁用状态 可清空输入框如何实现?组件写的

输入框禁用 通过 disabled 属性指定是否禁用 input 组件 <el-input placeholder"请输入内容" v-model"input" :disabled"true"> </el-input> <script> export default { data() { return { input: } } } </script> 可…

[套路] 浏览器引入Vue.js场景-WangEditor富文本编辑器的使用 (永久免费)

系列文章目录 [套路] el-table 多选属性实现单选效果[套路] 基于服务内存实现的中文拼音混合查询[套路] Bypass滑块验证码 目录 系列文章目录前言一、实现1.1 场景1.2 Window对象简介1.3 引入WangEditor1.4 页面配置 前言 公司使用freemarker的老旧SpringBootWeb后台项目, 前…

力扣热门算法题 59. 螺旋矩阵 II,60. 排列序列,61. 旋转链表

59. 螺旋矩阵 II&#xff0c;60. 排列序列&#xff0c;61. 旋转链表&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.21 可通过leetcode所有测试用例。 目录 59. 螺旋矩阵 II 解题思路 完整代码 Java Python 60. 排列序列 …

IDEA 2021.3.3最新激活破解教程(可激活至2099年,亲测有效)

下载地址&#xff1a;https://files.cnblogs.com/files/smallfa/ja-netfilter-all.rar?t1684636896&downloadtruehttps://files.cnblogs.com/files/smallfa/ja-netfilter-all.rar?t1684636896&downloadtrue1.Windows 系统下载解压到文件夹内&#xff0c;点击运行 ins…

就业班 2401--3.13 走进网络

走进网络 长风破浪会有时&#xff0c;直挂云帆济沧海。 1.认识计算机 1.计算机网络是由计算机和通讯构成的&#xff0c;网络研究的是“通信”。 ------1946 世界上第一台计算机 2.终端&#xff1a;只有输入和输出功能&#xff0c;没有计算和处理功能。 3.数据&#xff1a;一串…

学点儿Java_Day6_面向对象:类、封装、构造方法

1 类 1.1 定义 类&#xff1a;对现实世界中事物的抽象。Student 对象&#xff1a;现实世界中具体的个体。张三、李四 这些具体的学生 面向对象的特征&#xff1a;抽象、封装、继承、多态 OOP: Object Oriented Programming 类和对象的总结&#xff1a; 1、现实世界都是由很多…

JAVA多线程之JMM

文章目录 1. Java内存模型2. 内存交互3. 三大特性3.1 可见性3.1.1 可见性问题3.1.2 原因3.1.3 解决方法 3.2 原子性3.3 有序性 在继续学习JUC之前&#xff0c;我们现在这里介绍一下Java内存模型&#xff0c;也就是JMM&#xff0c;进而引出关键字volatile的使用条件。 1. Java内…

相机的内外参数标定和畸变矫正原理和代码

相机的成像过程实质上是坐标系转换。首先空间中的点坐标由世界坐标系转换到相机坐标系&#xff0c;然后将其投影到成像平面&#xff08;图像物理坐标系&#xff09;&#xff0c;最后再将成像平面上的数据转换到图像像素坐标系。但是由于透镜制造精度及组装工艺的差别会引入畸变…

【SQL】1251. 平均售价(IFNULL函数)

前述 知识点回顾&#xff1a;MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用 题目描述 leetcode题目&#xff1a;1251. 平均售价 Code select P.product_id,ifnull(round(sum(units * price) / sum(units), 2), 0) as average_price from Prices P left join UnitsS…

无痕消除笔APP好用吗?3款超实用软件分享

无痕消除笔APP好用吗&#xff1f;在日常生活中&#xff0c;无痕消除笔APP的便捷性不言而喻。无论是想要去除照片中的小瑕疵&#xff0c;还是快速修正文案中的错别字&#xff0c;这款工具都能迅速而精准地满足需求。它不仅提升了我们处理图片和文本的效率&#xff0c;还让我们的…

一个Flash编程错误标志的探析

1、问题描述 客户项目中使用的 MCU 型号是 STM32G0B1, 他们反馈在代码中尝试擦除并编程 FLASH时, 发现 FLASH 的状态寄存器显示编程错误(如图 1 所示). 问题是当前代码还没有开始擦除和编程, 怎么就有了编程错误标志了呢 ? 如果不将此错误标志清除, 后续的编程操作无法继续.客…