回溯算法!!

article/2025/8/2 4:35:29

只要有递归就会有回溯,回溯隐藏在递归函数的下面

回溯算法是回溯搜索算法,是纯暴力的搜索算法

一般用于解决以下问题

  • 组合问题:N个数里面按一定规则找出k个数的集合,组合是不强调元素顺序的,排列是强调元素顺序
  • 切割问题:一个字符串按一定规则有几种切割方式
  • 子集问题:一个N个数的集合里有多少符合条件的子集
  • 排列问题:N个数按一定规则全排列,有几种排列方式
  • 棋盘问题:N皇后,解数独等等

 一般的回溯问题是将问题抽象成一个n叉树进行递归,所以需要递归三部曲,集合的大小就构成了树的宽度,递归的深度就构成了树的深度

  • 确定参数列表返回类型
  • 确定终止条件
  • 确定单层逻辑
  • 模板
    void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
    }

组合问题;是无序,不重复的

1.给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。

如果n=4,k=2。那么可以用简单的两层for循环来解决,可是当n=100,k=50的时候就需要用50层for循环来解决,非常的繁琐

for(int i=1;i<n;i++){for(int j=i+1;j<n;j++){return [i,j];}
}

然后,我们将上述问题抽象成一个树形结构,看出for循环用来横向遍历,递归的过程是纵向遍历。

回溯三部曲

  • 确定递归函数参数和返回值:void backpacking(n,k,startindex),然后确定一维数组path,即n叉树中的路径(1,2)、(1,3).....和二维数组result记录所有的path结果,其中参数n,k,startindex,其中startindex是记录开始索引,即每一次从哪一个数开始组合
    void backpacking(n,k,startindex)
  • 确定终止条件:即每一次递归的结束条件就是到达叶子节点,也就是path.size = k,k就是n叉树的深度
    if(path.size == k)result.add(path);
  • 确定单层搜索逻辑:每一次的中间节点就是一次for循环,即从startindex开始遍历到n,比如这是startindex = 1,n=4,将1压入,进入回溯
    for (int i = startIndex; i <= n; i++) { // 控制树的横向遍历path.push_back(i); // 处理节点backtracking(n, k, i + 1); // 递归:控制树的纵向遍历,注意下一层搜索要从i+1开始path.pop_back(); // 回溯,撤销处理的节点
    }
class Solution {List<Integer> path = new ArrayList<>();List<List<Integer>> result = new ArrayList<>();public List<List<Integer>> combine(int n, int k) {backpacking(n,k,1);return result;}void backpacking(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);backpacking(n,k,i+1);path.removeLast();}}
}

完整代码如下:其中第一遍的过程是:

1.startindex=1,path.size = 0,进入for循环,i=1,path={1} ,然后进入递归si+1=2,path.size=1,进入for循环,i=2,2入队,path={1,2},进入递归si+1=3,达到终止条件,返回(1,2),这时将2移除path,path={1},i=3,3入队,path={1,3},进入递归si=4,达到结束条件,将(1,3)返回,将3移除,i=4,4入队,path={1,4},进入递归,达到终止条件,返回(1,4),这是退出i=1进行遍历的for循环.。。

2.进入i=2的for循环,即从2开始遍历组合的for循环。。。。

startIndex = 1
└── i = 1 → path = [1]└── i = 2 → path = [1,2] ✅ → result += [1,2]└── i = 3 → path = [1,3] ✅ → result += [1,3]└── i = 4 → path = [1,4] ✅ → result += [1,4]
└── i = 2 → path = [2]└── i = 3 → path = [2,3] ✅ → result += [2,3]└── i = 4 → path = [2,4] ✅ → result += [2,4]
└── i = 3 → path = [3]└── i = 4 → path = [3,4] ✅ → result += [3,4]
└── i = 4 → path = [4]└── i = 5 > n → 不执行


http://www.hkcw.cn/article/PANFtELpMI.shtml

相关文章

算法学习--持续更新

算法 2025年5月24日 完成&#xff1a;快速排序、快速排序基数优化、尾递归优化 快排 public class QuickSort {public void sort(int[] nums, int left, int right) {if(left>right){return;}int partiton quickSort(nums,left,right);sort(nums,left,partiton-1);sort(nu…

类和对象(4)

&#xff08;本文是《类和对象》的收尾&#xff09; 一.构造函数初始化的逻辑 1.构造函数的初始化列表使用说明 初始化列表是以冒号开头、逗号分隔成员变量的初始化方式&#xff0c;格式为&#xff1a; 构造函数() : 成员1(初始值), 成员2(表达式…

大规模真实场景 WiFi 感知基准数据集

一段话总结 本文提出CSI-Bench,首个大规模真实场景WiFi感知基准数据集,覆盖26个室内环境、35名用户、16种商用设备,包含461小时有效数据,支持跌倒检测、呼吸监测、定位、运动源识别等单任务及用户身份、活动、 proximity联合标注的多任务学习。通过标准化评估协议和基线模…

io流2——字节输入流,文件拷贝

!基本代码演示&#xff1a; 读取&#xff1a; 到程序中不是a&#xff0c;而是a的asicc码对应的数字 继续读读到最后&#xff1a; 不想看到数字&#xff0c;还想看abcde: 再继续读&#xff1a; 如果读不到了&#xff0c;就会返回-1 细节 细节一 细节2 字节输入流循环读取 …

沈白高铁开始最后测试 东北东部快速铁路通道进入联调联试

6月1日,首趟执行联调联试任务的综合巡检车从沈阳北站出发。沈白高铁开通运营后,辽宁将实现“市市通高铁”,对完善辽宁综合立体交通网络布局具有重要意义。这条高铁线路也将结束吉林省通化市、白山市不通高铁的历史,极大带动沿线旅游资源的开发。沈白高铁正线起自沈阳北站,…

山东友道化工厂爆炸前后 居民生活受冲击

山东友道化学有限公司发生爆炸事故,造成严重后果。事故发生时,距离公司1.7公里外的仁和街居民家窗户被震碎,范丽家超市的顶棚掉落,导致她头部受伤。诊所医生在当天下午处理了20多人的伤口,未收取费用。范丽的儿子从外地赶回家,将她送往医院治疗。高密仁和化工产业园内的友…

景区撒1千斤蚬子:让赶海游客有收获,吸引上万游客参与

近两日,多名网友分享了在辽宁省大连市夏家河子海滨浴场偶遇工作人员开着铲车、三轮车给游客撒蚬子赶海的场景。6月1日,景区回应称,在沙滩撒蚬子是为了让赶海的游客都能挖到东西。这两天,景区每天需要撒约1000斤的蚬子。此外,还有巴掌大的鲍鱼和海螺,如果游客捡到可以兑换…

萨巴伦卡2-0阿尼西莫娃 将战郑钦文 连胜挺进八强

在2025年法网女单1/8决赛中,头号种子萨巴伦卡以7-5和6-3的比分击败阿尼西莫娃,顺利晋级八强。这是萨巴伦卡连续第三年进入法网八强,并且她在最近参加的十个大满贯赛事中都至少闯入了八强,总计第十二次。接下来,萨巴伦卡将迎战中国选手郑钦文。这将是两人之间的第八次对决。…

关于神经网络中的激活函数

这篇博客主要介绍一下神经网络中的激活函数以及为什么要存在激活函数。 首先&#xff0c;我先做一个简单的类比&#xff1a;激活函数的作用就像给神经网络里的 “数字信号” 加了一个 “智能阀门”&#xff0c;让机器能学会像人类一样思考复杂问题。 没有激活i函数的神经网络…

开始使用 Elastic AI Assistant for Observability 和 Amazon Bedrock

作者&#xff1a;来自 Elastic Jonathan Simon 及 Udayasimha Theepireddy (Uday) 按照以下分步流程开始使用 Elastic AI Assistant for Observability 和 Amazon Bedrock。 如果你想使得下面的操作适用于 DeepSeek R1&#xff0c;那么你可以更进一步阅读文章 “使用 Ollama 和…

[平台运营] CSDN评论折叠机制对内容引流的影响与实践反思

[网页链接]在内容创作和知识分享过程中,很多技术博主会选择在 CSDN 这样的专业平台发布文章、经验总结或教程,并希望通过评论、互动的方式进一步引流到自己的其他优质内容(例如视频课程、开源项目等)。 但最近我在实操中遇到了一些有趣的现象,想在这里做个记录和分享,供有…

51单片机基础部分——LED

前言 之前更新过了蓝桥杯单片机的相关部分&#xff0c;那也是一款51单片机&#xff0c;主控芯片是STC15&#xff0c;现在我们要使用的是AT89C52&#xff0c;操作基于普中的51开发板进行开发&#xff0c;入门款的芯片&#xff0c;属于比较简单的&#xff0c;所以我们了解一下就…

js实现猜数字案例

<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body></body><script>// 猜随机数// 生成一个随机数并取整var guessNumber Math.floor(Math.random() * 100)console.log(…

[AI算法] LLM中LoRA的占用显存没有减少多少?

文章目录 Lora为什么没有减少多少显存几种Freeze的设置方式torch.no_gradrequire_gradFalseeval() Lora为什么没有减少多少显存 在使用 PEFT&#xff08;Parameter-Efficient Fine-Tuning&#xff09; 方法&#xff08;如 LoRA、IA 等&#xff09;时&#xff0c;你可能会观察到…

C++命名空间深度解析

1.命名空间的价值 在C/C中&#xff0c;变量、函数和类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突或名字污染&#xff0c;namespace…

上海工作机会:Technical Writer Senior Technical Writer - 中微半导体设备

大名鼎鼎的中微半导体招聘文档工程师了,就是那家由中国半导体产业的领军人物尹志尧领导的、全员持股的公司。如果你还不了解他,赶快Deepseek一下“尹志尧”了解。 招聘职位:Technical Writer & Senior Technical Writer 公司名称:中微半导体设备(上海)股份有限公司…

2024年12月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:最近的斐波那契数 斐波那契数列 Fn 的定义为:对 n ≥ 0 有 Fn+2 = Fn+1 + Fn,初始值为 F0 = 0 和 F1 = 1。所谓与给定的整数 N 最近的斐波那契数是指与 N 的差之绝对值最小的斐波那契数。 本题就请你为任意给定的整数 N 找出与之最…

大数据集群架构hadoop集群、Hbase集群、zookeeper、kafka、spark、flink、doris、dataease(三)

hbase集群部署 wget -c https://dlcdn.apache.org/hbase/2.5.10/hbase-2.5.10-bin.tar.gz 下载地址 在master-1操作 tar xf hbase-2.5.10-bin.tar.gz -C /data/ && mv /data/hbase-2.5.10 /data/hbase vim /etc/profile export HBASE_HOME/data/hbase export PAT…

2022—2025年:申博之路及硕士阶段总结

文章目录 1 前景概要2 打造神兵利器2.1 夺天地之精2.2 锻兵魂之形2.3 契人兵之命 3 潜心闭关修炼3.1 第一阶段&#xff1a;苦心智3.2 第二阶段&#xff1a;劳筋骨3.3 第三阶段&#xff1a;摧意志 4 突破晋级4.1 突破失败4.2 聚气凝神4.3 心魔再现4.4 新起点 5 回顾及深思 1 前景…

NetSuite Bundle - Dashboard Refresh

儿童节快乐&#xff01; 今朝发一个Bundle&#xff0c;解决一个NetSuite Dashboard的老问题。出于性能上的考虑&#xff0c;NetSuite的Dashboard中的Portlet&#xff0c;只能逐一手工刷新。有人基于浏览器做了插件&#xff0c;可以进行自动刷新。但是在我们做项目部署时&#…