代码随想录第二十二天| 77. 组合 216.组合总和III 17.电话号码的字母组合

Accelstepper 库中的参数计算公式 要完全调试电机的各个参数,例如最大速度,加速度等,就需要了解其计算公式和原理。 以下是代码注释: /// This code uses speed calculations as described in /// "Generate stepper-motor speed profiles in real time" by David Austin/// http://fab.cba.mi... 阅读详情

题目:组合

问题描述:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。

解题思路

  1. 回溯法:使用回溯法生成所有可能的组合。
  2. 递归构建组合:
  • 从1到n中选择一个数作为组合的第一个数,然后递归地从剩余的数中选择k-1个数。
  1. 剪枝优化:
  • 在递归过程中,通过计算剩余可选的数的数量来提前终止不必要的递归,从而减少计算量。
  1. 路径记录:
  • 使用一个列表 path 来记录当前的组合路径。
  1. 结果收集:
  • 当 path 的长度等于 k 时,将其添加到结果列表 result 中。

代码:

class Solution {
	List<List<Integer>> result = new ArrayList<>();
	LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backtreeing(n,k,1);
		return result;
    }
	public void backtreeing(int n, int k,int startindex) {
		if(path.size() == k){
			result.add(new ArrayList<>(path));
			return;
		}
		for(int i = startindex;i<=n;i++){
			path.add(i);
			backtreeing(n,k,i+1);
			path.removeLast();
		}
	}
}
class Solution {
	List<List<Integer>> result = new ArrayList<>();
	LinkedList<Integer> path = new LinkedList<>();
    public List<List<Integer>> combine(int n, int k) {
        backtreeing(n,k,1);
		return result;
    }
	public void backtreeing(int n, int k,int startindex) {
		if(path.size() == k){
			result.add(new ArrayList<>(path));
			return;
		}
		for(int i = startindex;i<=n-(k-path.size())+1;i++){
			path.add(i);
			backtreeing(n,k,i+1);
			path.removeLast();
		}
	}
}

216. 组合总和 III

题目描述

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

  • 所有数字都是正整数。
  • 解集不能包含重复的组合。

解题思路

这道题是一个典型的回溯问题。我们需要从数字 1 到 9 中选择 k 个数字,并确保它们的和为 n。通过回溯的方式,我们可以探索所有的组合。

关键点:

  1. 递归回溯:每次选择一个数字,并将其添加到路径中,再继续选择下一个数字。回溯时要恢复状态。
  2. 限制条件:
    • 当前组合的大小不能超过 k。
    • 每次选择的数字不能重复,并且必须从当前位置的下一个数字开始选择。
    • 如果当前路径的和为 n 且路径大小为 k,则记录该路径。

步骤:

  1. 递归调用:我们从 1 开始递归,每次选择一个数字加入路径并继续递归。
  2. 回溯:当递归到一个路径大小为 k 时,检查路径和是否为 n。如果是,加入结果列表。
  3. 优化剪枝:为了避免不必要的递归,递归中的 startIndex 会根据剩余的数字个数进行调整。具体来说,在每一层递归中,我们可以减少剩余选择的数字数量。

代码实现

class Solution {
	private List<List<Integer>> result = new ArrayList<>();
	private LinkedList<Integer> path = new LinkedList<Integer>();
    public List<List<Integer>> combinationSum3(int k, int n) {
		treebuild(k,n,0,1);
		return result;
    }
	public void treebuild(int k, int n,int sum,int startindex) {
		if(path.size()==k){
			if(sum==n){
				result.add(new ArrayList<>(path));
			}
			return;
		}
		for(int i=startindex;i<10;i++){
			path.add(i);
			sum=sum+i;
			treebuild(k,n,sum,i+1);
			sum=sum-i;
			path.removeLast();
		}
	}
}
class Solution {
	private List<List<Integer>> result = new ArrayList<>();
	private LinkedList<Integer> path = new LinkedList<Integer>();
    public List<List<Integer>> combinationSum3(int k, int n) {
		treebuild(k,n,0,1);
		return result;
    }
	public void treebuild(int k, int n,int sum,int startindex) {
		if(path.size()==k){
			if(sum==n){
				result.add(new ArrayList<>(path));
			}
			return;
		}
		for(int i=startindex;i<10-(k-path.size())+1;i++){
			path.add(i);
			sum=sum+i;
			treebuild(k,n,sum,i+1);
			sum=sum-i;
			path.removeLast();
		}
	}
}

17. 电话号码的字母组合

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母

解题思路

这道题是一个典型的回溯问题。我们需要通过递归遍历每个数字对应的字母,然后生成所有可能的字母组合。

关键点:

  1. 数字到字母的映射:每个数字(2-9)都对应一组字母,我们可以用数组或者字典来存储这种映射。
  2. 回溯法:我们可以使用回溯法来生成所有可能的组合。每次递归时,选择当前数字对应的字母之一,然后进入下一个数字的递归调用。
  3. 字符串拼接:用 StringBuilder 来拼接每次的选择,避免频繁创建新的字符串。
  4. 终止条件:当递归到达数字字符串的末尾时,表示一个完整的组合已经生成,将其添加到结果列表中。

步骤:

  1. 递归遍历:从数字字符串的第一个字符开始,遍历所有可能的字母,递归调用下一层。
  2. 回溯:每当递归进入下一层时,我们会选择一个字母,递归回来后,删除上次选择的字母,继续选择下一个字母。

代码实现

class Solution {
	private String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
	List<String> list = new ArrayList<>();
	StringBuilder path = new StringBuilder();
    public List<String> letterCombinations(String digits) {
		if(digits==null || digits.length()==0){
			return list;
		}
		treebuilding(digits,0);
		return list;
    }
	public void treebuilding(String digits,int startindex) {
		if(startindex==digits.length()){
			list.add(path.toString());
			return;
		}
		String str = numString[digits.charAt(startindex)-'0'];
		for(int i = 0;i<str.length();i++){
			path.append(str.charAt(i));
			treebuilding(digits,startindex+1);
			path.deleteCharAt(path.length()-1);
		}
	}
}
【自然语言处理】情感分析(一):基于 NLTK 的 Naive Bayes 实现 朴素贝叶斯(Naive Bayes)分类器可以用来确定输入文本属于某一组类别的概率。例如,预测评论是正面的还是负面的。它是 “朴素的”,它假设文本中的单词是独立的(但在现实的自然人类语言中,单词的顺序传达了上下文信息)。尽管有这些假设,但朴素贝叶斯在使用少量训练集预测类别时具有很高的准确性。 阅读详情

相关推荐

阿里云Windows服务器部署网站全流程:从IIS配置到安全上线

Web服务器是承载网站应用、处理HTTP请求的核心软件。其工作原理是监听特定网络端口,接收客户端请求,并返回相应的网页、文件或动态生成的内容。在Windows Server环境中,IIS(Internet Information Services)作为微软官方Web服务器,凭借其与操作系统深度集成、图形化管理界面和对ASP.NET等微软技术栈的良好支持,成为许多开发者和运维人员的首选。其技术价值在于提供了稳定、可扩展的托管平台,支持从简单的静态网站到复杂的企业级Web应用。在云服务器普及的今天,将IIS部署

weixin_33552698的博客 327

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

力扣算法和代码随想录

LXY999222的博客 785

轻量级NAS的隐秘战场:比特米盒CumeBox2与CasaOS的生态融合实践

本文探讨了比特米盒CumeBox2轻量级NAS设备与CasaOS操作系统的生态融合实践。通过硬件选型、系统部署、性能优化和应用场景分析,展示了如何将CumeBox2与CasaOS深度整合,打造经济实用的家庭数据管理中心,特别适合入门级用户和小型办公环境。

rl6adventurer的博客 895

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

的,前两题都是对同一个数组进行操作,同时也设置了startIndex来记录下一层数组的起始位置(其实也可以看成是一个新的数组,数组的第一个元素在startIndex的位置)。但是本题中每一层用到的数组需要根据层数(index)和不同的digit来回溯不同的数组(letterMap)。,那么再往后就会产生三种情况,分别是[1, 2], [1, 3], [1, 4]。,如下图,这棵树就是通过[1, 2, 3, 4]这个集合得到的,从1开始向后取数,取过的数不再重复取。假设第一次取出的是1,也就是图中的从。

python1_1的博客 358

STK中的传感器与通信组件:雷达、发射机、接收机与天线的协同建模

本文深入解析了STK软件中传感器、雷达、发射机、接收机与天线的协同建模方法。通过构建一个完整的卫星对地数传系统实例,阐述了各组件如何分工协作,实现从几何指向到射频链路的高保真仿真,为复杂航天通信与探测系统的设计与分析提供了高效、灵活的解决方案。

weixin_29271263的博客 273

国标Gb28181里Contact和Route的使用

国标Gb28181是基于Sip协议的,因此对Contact和Route的使用,也可以说是Sip里Contact和Route的使用。Contact和Route则是sip协议里的头字段。 现在,在使用国标Gb28181来做项目时,经常会遇到这种情况,国标的下级是在内网里,上级在公网上。如果不做处理,下级到上级会经过nat协议的转换从而导致上级向下级发送请求时(比如获取目录请求)不能到达

wwyyxx26的专栏 5511

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

打卡代码随想录算法训练营第49期第二十二天ヽ(✿゚▽゚)ノ首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站。

tancxiaohei23的博客 653

YOLO11 改进、魔改|分组残差自注意力GRSA,通过分组残差优化 QKV 计算、指数空间映射优化位置偏差,在大幅降低自注意力模块参数和计算量的同时,增强特征关系与位置信息的表征能力

【摘要】研究人员提出GRSA(分组残差自注意力)机制,解决Transformer在图像超分辨率任务中效率与性能难以兼顾的问题。GRSA通过分组残差层减少自注意力参数冗余,同时采用指数空间相对位置偏差优化位置信息表征。实验表明,GRSA在降低50%参数量的同时保持模型性能,适用于目标检测和图像分割任务。在YOLO系列模型中集成GRSA可提升小目标检测精度,代码实现已开源,详细部署教程见相关视频与GitHub资源。该机制为轻量化Transformer模型提供了高效解决方案。

qq_64693987的博客 796

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

思考:组合问题,可以理解为在树结构中找路径的问题,这样便于理解递归+回溯的思想。如下图:在[1, n]中寻找k个数字的所有组合情况,相当于在这样一个树结构中寻找不同的路径。最后返回的结果,就是把所有路径放在一个数组中。寻找路径相当于遍历这棵树,因此需要递归,在这个树的节点上,可以有多种选择,比如取2,取3,取4,因此需要回溯。当一个路径包含的元素数=k时,该路径符合要求,可以保存下来。由于是寻找组合情况,相同数字不可以重复取,因此当取过一个数字时,剩下可以取的数字数量就是d=k - len(path)

qq_42493281的博客 417

25、格式化字符串攻击全解析

本文深入解析了格式化字符串攻击的原理与利用方式,涵盖缓冲区溢出与格式化字符串漏洞的区别,详细介绍了printf函数的工作机制、常见格式化说明符及其安全隐患。文章分析了三类典型编程错误导致的漏洞,并展示了如何通过恶意格式化字符串实现拒绝服务、内存读取和写入攻击。同时,提供了有效的防御措施,包括输入验证、使用安全函数、避免直接使用用户输入作为格式化字符串以及启用编译器安全选项,帮助开发者防范此类高危漏洞。

beer8的博客 83

【人工智能 Open AI】程序员怎样提升研发效率?从技术、业务、项目管理等等多个方面来阐述。

程序员要想提升研发效率,需要从技术、业务、项目管理等多方面着手,多靠工具配合实践实现,从而提升研发效率。

AI天才研究院 5526

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

第一次接触这种循环嵌套回溯的算法,感觉看完思路以后写的过程还好,但是对于具体的实现细节还是有点懵,另外要。

weixin_64181248的博客 419

PCL点云八叉树体素中心下采样,体素包含点索引提取

基于PCL octree实现点云八叉树计算,支持提取体素中心点进行点云下采样;根据任一点坐标,可以得到其在八叉树中的位置,输出对应体素内其余点的坐标或者索引

qq_48694523的博客 462

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

训练营已经结束了,果然没有跟上进度打卡害 但是比上一期已经有进步了!继续加油 争取在接下来两个月补完!然后二刷。

2301_78860250的博客 446

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

入营第二十二天。

z542968z的博客 256

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

很有意思,和二叉树递归和回溯很像

qq_43487696的博客 246

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

代码随想录训练营第二十二天 | 回溯 77. 组合 216.组合总和III17.电话号码的字母组合

不能重复的组合就是集合:使用startIndex即可横向遍历。

weixin_45793258的博客 168

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

回溯法就是暴力搜索,穷举所有可能性,最终得到答案。

2302_80777118的博客 651

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

回溯法章节开始,逐渐开始正式复习算法设计课的知识。文章图片来源:代码随想录 (https://programmercarl.com/)

Mwicogito的博客 3148

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

叶子节点就是要收集的结果集,终止条件就是index 等于输入的数字个数(digits.size)了(本来index就是用来遍历digits的),然后收集结果,结束本层递归。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。还有一个参数就是int型的index记录遍历第几个数字了,用来遍历digits的,同时index也表示树的深度。这棵树,一开始集合是 1,2,3,4, 从左向右取数,取过的数,不再重复取。

m0_50413530的博客 1019

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

补第二十二天!

2401_86461473的博客 132

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

思路:开始想循环,感觉行不通,然后看了视频,就嗯理解了一些感觉跟递归的思路确实差不多。

angela3264的博客 1222

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

文档讲解:https://programmercarl.com/0017.%E7%94%B5%E8%AF%9D%E5%8F%B7%E7%A0%81%E7%9A%84%E5%AD%97%E6%AF%8D%E7%BB%84%E5%90%88.html。文档讲解:https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html。

m0_45175414的博客 705

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

图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。第一次取1,集合变为2,3,4 ,因为k为2,我们只需要再取一个数就可以了,分别取2,3,4,得到集合[1,2] [1,3] [1,4],以此类推。图中每一个节点(图中为矩形),就代表本层的一个for循环,那么每一层的for循环从第二个数开始遍历的话,都没有意义,都是无效遍历。

懒羊羊在努力的博客 1073

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

题号来自leetcode。

m0_61579911的博客 869

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

摘要:本文系统介绍了回溯算法的理论基础和应用实践。首先阐述回溯法的定义(一种递归搜索方式)和效率优化方法(剪枝操作),并列举其适用的五类问题(组合、切割、子集、排列、棋盘问题)。随后通过三个典型例题详细讲解回溯法的应用:77题展示组合问题的基本解法与剪枝优化;216题在组合基础上增加总和条件;17题处理多集合组合问题。每个案例均包含解题思路、代码实现和剪枝优化技巧,突出回溯法的树形结构特征(横向遍历集合元素,纵向递归延伸)和模板化实现方法。

SchrysanthemumS的博客 394
上一篇: 代码随想录第二十一天| 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树
下一篇: 代码随想录第二十三天| 39. 组合总和 40.组合总和II 131.分割回文串
kill bert
博客等级 码龄8年 736粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值