算法训练营Day22

#Java #回溯

开源学习资料

Feeling and experiences:

进入到回溯算法的章节,在代码随想录中有详细的回溯算法理论基础

在此总结归纳:

刚开始接触到回溯时,看到了终止条件,递归调用.....等,发现了其与递归三部曲有异曲同工之妙~

回溯三部曲:

1. 路径:
• 已经做出的选择,代表了到达当前状态所经过的路径。
• 通常表示为一个列表或栈,用来保存已经做出的选择。


2. 选择列表:
• 当前可以做的选择。
• 根据问题的不同,选择列表可能会随着路径的增长而变化。
• 重要的是要从选择列表中排除那些因为已经在路径中的选择而变得不合适的选项。


3. 结束条件:
• 何时停止递归,结束当前的探索过程。
• 通常是达到了问题的解决条件,如路径长度达到某个值,或是已经检查了所有可能的选择。

组合:力扣题目链接

给定两个整数 nk,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

以下引用代码随想录中的图解:

代码如下:

class Solution {//创建一个集合,用来存放每一次组合结果List<List<Integer>> ans = new ArrayList<>();//创建一个链式集合,用来进行回溯操作List<Integer> path = new LinkedList<>();public List<List<Integer>> combine(int n, int k) {getCombine(n,k,1);return ans;}public void getCombine(int n , int k , int startIndex){//终止条件:当path 的大小为 k 时则要返回一次结果if(path.size() == k){ans.add(new ArrayList(path));return;}for(int i = startIndex; i <=n;i++){path.add(i);getCombine(n,k,i+1);path.removeLast();}}
}

 整体思路:

终止条件:当path的大小等于k时,将其添加到ans中,并返回上一层递归。


• 循环和递归:从startIndex遍历到n。对于每个i,执行以下操作:
• 选择:将i加入path。
• 递归:调用getCombine(n, k, i + 1)进行下一步的选择。
• 撤销选择:递归返回后,移除path的最后一个元素(这是撤销操作的核心)。

为什么在递归调用getCombine时,是 i+1,而不是 startIndex + 1 ?

  如果使用startIndex+1,每次递归调用时起始索引只会基于原始的startIndex递增,而不是基于当前选择的数字 i 。
这将导致生成重复的组合。例如,对于(n, k) = (4, 2),使用startIndex+1可能会产生两次[1, 2]的组合:一次从1开始,一次从2开始。

  使用i+1是为了在每次递归时,都是基于当前选择的数字进一步选择更大的数字,保证了组合中的数字是按照递增顺序排列的,同时避免了重复的组合。

对于剪枝优化,后面再做深入学习~

Fighting!

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

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

相关文章

【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化

引言 动态内存管理的函数有&#xff1a;malloc,calloc,ralloc,free,本文讲解动态内存函数和使用&#xff0c;如何进行动态内存管理,实现通讯录联系人容量的动态化&#xff0c;对常见动态内存错误进行总结。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》…

Vue.js 教程

Vue.js&#xff08;读音 /vjuː/, 类似于 view&#xff09; 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 阅读本教程前&#xff0c;您需要了解的…

FPGA编程入门——基于Quartus件完成一个1位全加器的设计

基于Quartus件完成一个1位全加器的设计&#xff0c;分别采用&#xff1a;1&#xff09;原理图输入 以及 2&#xff09;Verilog编程 这两种设计方法。开发板基于Intel DE2-115。 在此基础上&#xff0c;用原理图以及Verilog 编程两种方式&#xff0c;完成4位全加器的设计&#x…

竞赛保研 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

SQL---Zeppeline前驱记录与后驱记录查询

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

Latex生成的PDF中加入书签/Navigation/导航

本文参考&#xff1a;【Latex学习】在生成pdf中加入书签/目录/提纲_latex 书签-CSDN博客 &#xff08;这篇文章写的真的太棒了&#xff01;非常推荐&#xff09; 题外话&#xff0c;我的碎碎念&#xff0c;这也是我如何提高搜索能力的办法&#xff1a;想在Latex生成的PDF中加入…

Java代码审计Mybatis注入文件上传下载读取(非常详细!!)

目录 0x00 前言 0x01 Mybatis注入审计 - 若依&#xff08;Ruoyi&#xff09;后台管理系统 4.6.0 1、项目介绍与部署 - Ruoyi 2、若依 Ruoyi - Mybatis注入 - 代码审计 3、代审常搜词 - Java SQL 注入 0x02 文件上传漏洞审计 - Inxedu && Tmall 1、项目介绍与部署…

大规模采用奇点临近?Web3应用爆发离不开这个“支撑”赛道

作者&#xff5c;Jason Jiang 数据是当今世界最具价值的资源&#xff0c;也是数字掘金的必争之地。尽管Web3迄今仍有诸多争议&#xff0c;但随着铭文、Gamefi、DeFi等链上生态的多样化发展&#xff0c;我们正身处Web3应用爆发的洪流之中&#xff0c;区块链数据赛道也因此备受关…

Qt 多线程用法

文章目录 开发平台QThread 类 moveToThreadQtConcurrent::run QFutureWatcherQThreadPool QRunnable 开发平台 项目说明OSwin10 x64Qt6.6compilermsvc2022构建工具cmake QThread 类 moveToThread 写一个简单的例子吧,比较容易理解,方便入门. 也可以看出这种方式,对于线程…

基于SSM框架的二手房中介管理系统+vue论文

摘 要 如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于二手房信…

达梦到达梦的外部链接dblink(DM-DM DBLINK)

一. 使用场景&#xff1a; 部链接对象&#xff08;LINK&#xff09;是 DM 中的一种特殊的数据库实体对象&#xff0c;它记录了远程数据库的连接和路径信息&#xff0c;用于建立与远程数据的联系。通过多台数据库主库间的相互通讯&#xff0c;用户可以透明地操作远程数据库的数…

25年老品牌 美好蕴育润康守护孕期妈妈的健康之路

孕期是每一位女性人生中最为特殊的阶段。每一位妈妈都期待着健康、快乐的度过每一天。然而&#xff0c;随着孕周的增加&#xff0c;孕期的不适和困扰也随之而来。孕吐、腰酸背痛、便秘等孕期症状让许多妈妈倍感疲惫和焦虑。在这个关键时刻&#xff0c;美好蕴育润康作为25年的老…