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

77. 组合

在这里插入图片描述

题目链接:77. 组合
文档讲解:代码随想录
状态:很多细节忘了

思路:先画图,然后可以发现,从1到n中选择k个数,可以看成是一个递归过程,这个递归的深度就是k。然后遍历当前这层集合可以看作一个for循环,就是逐个元素尝试的过程。

  • for 循环:遍历集合的宽度,是一个取元素的过程。它负责在当前递归层次上,依次选择不同的元素,并将选择的元素添加到当前路径 path 中。
  • backtracking 方法:组合的过程。它负责递归地处理后续的选择,构建出完整的组合。当路径 path 满足条件(长度等于 k)时,将当前路径添加到结果列表 res 中。

剪枝优化:画图时可以发现,有时for循环后面几个集合不满足条件可以提前结束。
这里剪枝有两种思路:

  1. path.size()表示当前已经收集到的元素个数,k - path.size()表示还剩几个元素需要收集,n - (k - path.size()) + 1 表示当前位置 i 往后至少还需几个元素才能凑齐。如果 i 超过这个范围,就意味着即使选择当前位置的元素,剩余的元素数量也不足以凑齐需要选择的个数,因此就没有必要继续往下搜索了,可以提前结束这个分支的搜索。
  2. 也可以这样理解:k-path.size()<=n-i+1,就是还需收集的元素的个数应该小于当前还能选的元素的个数。
    在这里插入图片描述

错误代码:

    public void backtracking(int n, int k, List<List<Integer>> res, LinkedList<Integer> path) {if (path.size() == k) {res.add(path);//错误1.res每次应该加入的是新的path,因为path回溯的过程中会导致res中的path为空!return;}for (int i = 1; i <= n - k + 1; i++) {//错误2.i应该从start开始;错误3.剪枝操作应该是i<=n-(k-path.size())+1,path.add(i);backtracking(i + 1, k, res, path);//错误2.这里第一个参数n是不会变的,因此需要一个start表示开始索引path.removeLast();}}

题解:

    public List<List<Integer>> combine(int n, int k) {List<List<Integer>> res = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();backtracking(n, k, 1, res, path);return res;}public void backtracking(int n, int k, int start, List<List<Integer>> res, LinkedList<Integer> path) {if (path.size() == k) {res.add(new ArrayList<>(path));return;}// 剪枝,k-path.size()<=n-i+1,就是还需收集的元素的个数应该小于当前还能选的元素的个数for (int i = start; k - path.size() <= n - i + 1; i++) {path.add(i);backtracking(n, k, i + 1, res, path);path.removeLast();}}

216.组合总和III

在这里插入图片描述

题目链接:216.组合总和III
文档讲解:代码随想录
状态:经过上一题后,写法想起来了,但是自己在剪枝这边的写法并不是最优的

思路:就是组合的基础上加上了求和。

题解:

List<List<Integer>> res = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();int sum = 0;// 主方法,找到所有k个数的组合,其和为npublic List<List<Integer>> combinationSum3(int k, int n) {backtracking(k, n, 1);return res;}// 回溯方法public void backtracking(int k, int n, int startIndex) {// 当路径长度等于k时,检查当前路径上的数字和是否等于目标值nif (path.size() == k) {if (sum == n) {// 如果满足条件,添加当前路径到结果列表中res.add(new ArrayList<>(path));}return;}// 从startIndex开始遍历数字1到9//剪枝: 一方面,剩余收集的元素数量要小于等于当前集合中剩余元素数量,另一方面当前路径上的数字和加上当前数字要小于等于目标值nfor (int i = startIndex; i <= 9 && k - path.size() <= 9 - i + 1 && sum + i <= n; i++) {path.add(i); // 将当前数字i加入路径sum += i;    // 更新当前路径数字和backtracking(k, n, i + 1); // 递归调用,继续选择下一个数字sum -= i;    // 回溯,撤销选择path.removeLast(); // 回溯,撤销选择}}

17.电话号码的字母组合

在这里插入图片描述

题目链接:17.电话号码的字母组合
文档讲解:代码随想录
状态:还行

思路:先将数字对应的字符串存到map或者数组中,递归的时候根据深度取不同的字符串,for循环则是对当前层的字符串进行遍历。

题解:

    String[] letterMap = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};List<String> res = new ArrayList<>();StringBuilder sb = new StringBuilder();public List<String> letterCombinations(String digits) {if (digits.isEmpty()) {return res;}char[] chars = digits.toCharArray();String[] strings = new String[chars.length];for (int i = 0; i < chars.length; i++) {strings[i] = letterMap[chars[i] - '0'];}backtracking(strings, chars.length);return res;}public void backtracking(String[] strings, int k) {if (sb.length() == k) {res.add(sb.toString());return;}int len = sb.length();char[] chars = strings[len].toCharArray();for (int i = 0; i <= chars.length - 1; i++) {sb.append(chars[i]);backtracking(strings, k);sb.setLength(len);}}

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

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

相关文章

四舍五入 和 交换变量值 题目

题目 JAVA3 四舍五入分析&#xff1a;代码&#xff1a; JAVA4 交换变量值分析&#xff1a;代码&#xff1a;大佬代码&#xff1a; JAVA3 四舍五入 描述 定义一个int类型变量i,i为由浮点数变量d四舍五入后的整数类型&#xff0c;请将转换后的i进行输出。 输入描述&#xff1a;…

Centos7安装jdk8或11以及切换方案

目录 jdk安装 安装OpenJDK11 安装OpenJDK8 配置默认的 Java 版本 验证 全局环境变量&#xff08;选配&#xff09; 个人版&#xff08;自己可以用&#xff0c;公司不建议&#xff09; 公司版本 /etc/profile 和 ~/.bash_profile 区别 前言-与正文无关 生活远不止眼前的苦…

【动态规划】| 路径问题之不同路径 力扣62

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;动态规划 &#x1f397;️ 如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/unique-paths/description/ 通常动态规划的题目有…

建筑电工精选最新模拟试题(含答案)

一、填空题 1、我国安全生产的基本方针是 安全 第一&#xff0c;预防 为主&#xff0c;综合治理。 2、特种作业人员&#xff0c;必须积极主动参加培训与考核 。既是法律法规的规定&#xff0c;也是自身工作&#xff0c;生产及生命安全 的需要 3、触电急救&#x…

如何在React组件中实现父子组件之间的通信?

在React中&#xff0c;父子组件之间的通信通常通过props&#xff08;属性&#xff09;和回调函数来实现。以下是具体的实现方式&#xff1a; 父组件向子组件传递数据&#xff08;通过props&#xff09; 在父组件中&#xff0c;你可以通过向子组件传递props来发送数据。子组件…

【Tkinter界面】Canvas 图形绘制(03/5)

文章目录 一、说明二、画布和画布对象2.1 画布坐标系2.2 鼠标点中画布位置2.3 画布对象显示的顺序2.4 指定画布对象 三、你应该知道的画布对象操作3.1 什么是Tag3.2 操作Tag的函数 https://www.cnblogs.com/rainbow-tan/p/14852553.html 一、说明 Canvas&#xff08;画布&…

双指针练习:和为s的两个数字

题目链接&#xff1a;剑指offer 57.和为s的两个数字 题目描述&#xff1a; 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 示例 1&#xff1a; 输入&#xff1a;price [3, 9…

【Windows】配置Flutter开发环境

一、下载 flutter sdk 点此跳至下载官网 下载好flutter sdk&#xff0c;并解压到自定义的位置。 二、配置环境变量 此电脑 --> 右键 选择 属性 --> 点击 高级系统设置 --> 会弹出系统属性的窗口&#xff0c;点击 环境变量 按钮 1.配置加速镜像地址 PUB_HOSTED_…

Web前端设计毕业论文:深度探索与未来展望

Web前端设计毕业论文&#xff1a;深度探索与未来展望 在数字化时代&#xff0c;Web前端设计作为互联网应用的重要组成部分&#xff0c;其重要性和复杂性日益凸显。本论文旨在深度探索Web前端设计的关键要素、发展趋势以及面临的挑战&#xff0c;为未来的研究和实践提供有价值的…

【python】python指南(四):typing静态类型注解综述

一、引言 对于算法工程师来说&#xff0c;语言从来都不是关键&#xff0c;关键是快速学习以及解决问题的能力。大学的时候参加ACM/ICPC一直使用的是C语言&#xff0c;实习的时候做一个算法策略后台用的是php&#xff0c;毕业后做策略算法开发&#xff0c;因为要用spark&#x…

大话C语言:第24篇 预处理

1 C语言编译流程 C语言的编译流程包括&#xff1a; 预编译&#xff1a;将.c 中的头文件展开、宏展开&#xff0c;生成的文件是.i 文件。gcc指令&#xff1a;gcc -E file.c -o file.i 编译&#xff1a;将预处理之后的.i 文件生成 .s 汇编文件。gcc指令&#xff1a;gcc -S file…

Java课设项目

项目简介:射击生存类小游戏 项目采用技术: 游戏引擎: Unity 编程语言: Java 图形处理: NVIDIA PhysX (物理引擎), HDRP (High Definition Render Pipeline) 音效与音乐: FMOD, Wwise 版本控制: Git 功能需求分析: 角色控制&#xff1a;玩家能够使用键盘和鼠标控制角色移动、…

AI影像时代来临,联发科天玑以专业无畏精神重新定义手机专业影像

近期&#xff0c;联发科与Discovery探索频道联合举办了一场以“越极境&#xff0c;见芯境”为主题的天玑影像展&#xff0c;活动地点位于我国桂林阳朔。活动现场展示了阳朔壮美山水的画卷&#xff0c;以及救援队员在岩壁上进行训练的极限瞬间。令人意想不到的是&#xff0c;这些…

【课程系列01】某乎的AI大模型全栈工程师-第4期

网盘链接 链接&#xff1a;https://pan.baidu.com/s/1QLkRW_DmIm1q9XvNiOGwtQ --来自百度网盘超级会员v6的分享 课程目标 AI大模型全栈工程师是指具备人工智能领域全方位能力的工程师&#xff0c;特别是在大模型开发和应用方面具有深厚的专业知识和技能。以下是关于AI大模型…

第12章.STM32标准库简介

目录 0. 《STM32单片机自学教程》专栏 12.1 CMSIS 标准 12.2 STM32标准库文件结构 12.2.1 主结构 12.2.2 Libraries固件库文件 CMSIS文件夹 1.core_cm3.c&core_cm3.h 2.startup启动文件 3.Stm32f10x.h 4.system_stm32f10x.c&system_stm32f10…

Linux常用命令及或g++(或gcc)编辑器运用

一. 实验内容 1&#xff0e;打开VMware Workstation虚拟机进入Ubuntu系统&#xff0c;打开终端。 练习使用常用的Linux命令&#xff0c;主要包括如下命令&#xff1a; mkdir, rmdir, cd, pwd, ls, clear, cat, rm等。&#xff08;其中&#xff0c;cat、rm命令请在下面实验内容3…

IIC通信总线

文章目录 1. IIC总线协议1. IIC简介2. IIC时序1. 数据有效性2. 起始信号和终止信号3. 数据格式4. 应答和非应答信号5. 时钟同步6. 写数据和读数据 2. AT24C023. AT24C02读写时序4. AT24C02配置步骤5. 代码部分1. IIC基本信号2. AT24C02驱动代码3. 实验结果分析 1. IIC总线协议 …

C#中数组ProtoBuf使用问题

使用 C# 类库 Google.Protobuf 包&#xff0c;进行协议定义&#xff0c;当给数组属性赋值默认值时&#xff0c;出现反序列化以后&#xff0c;数组长度翻倍&#xff0c;多的一部分在最前面&#xff0c;而且都是数组元素的默认值 Code: // 类定义 [ProtoContract] public class…

大厂笔试真题讲解—美团23年—小美的字符串变换

本题主要讲解小美的字符串变换的要点和细节&#xff0c;根据步骤一步步思考方便理解 提供c的核心代码以及acm模式代码&#xff0c;末尾 题目描述 小美拿到了一个长度为 n 的字符串&#xff0c;她希望将字符串从左到右平铺成一个矩阵&#xff08;先平铺第一行&#xff0c;然后是…

【使用python如何获取excel中sheet页的样式】

在Python中&#xff0c;要获取Excel文件中sheet页的样式&#xff08;如字体、颜色、边框等&#xff09;&#xff0c;你通常会使用openpyxl&#xff08;用于处理.xlsx文件&#xff09;或xlrd和xlwt&#xff08;用于处理较旧的.xls文件&#xff0c;但xlrd的新版本已不再支持.xlsx…