news 2026/6/25 23:32:01

穷举vs暴搜vs深搜vs回溯vs剪枝算法介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
穷举vs暴搜vs深搜vs回溯vs剪枝算法介绍

1.全排列

46. 全排列 - 力扣(LeetCode)https://leetcode.cn/problems/permutations/description/这道题是一道穷举的题,最终把所有全排列弄出来返回就行。用for循环也能穷举出来,但数据量大就会使效率很慢,所以用递归来帮我们把所有情况枚举出来。首先画出决策树(越详细越好):如1 2 3,有三个空格。开始后要么选1,要么选2,要么选3。选1就是1_ _,选2就是2_ _,选3就是3_ _。在第一种选法基础上进行第二次选,第二个位置依旧可选1选2选3,但数不能重复,所以1这个枝减掉,然后选2选3变成了12_ 13_,其余同理:

最后一次也一样把重复的剪了,最后可得到结果:

画好决策树后可以发现,每个结点都是枚举出整个数组里的所有数,只不过有些枝被干了,当每个结点干同样事时就可把决策树改为递归了。2.设计代码,要有全局变量,需要有个二维数组ret记录最终结果,还有个int类的数组path记录路径上的选择。深搜刚开始path什么也没有,选1后给path添1,到下一层……当path长度等于nums长度时说明发现了一种情况,然后把结果放ret中:

(回到上一层进入了分枝时要把2干了)那怎么剪枝呢?如当选1进入下一层时如何避免选到1呢?所以需要一个bool类型的check数组,帮我们判断这个数在路径中是否已被使用(记录下标)。因此比如开始选2时,就把bool类型的check[1]设为true,下次选数时先去check中看一下。2.dfs函数:我们仅需关心某个节点在干嘛,就是把数组中所有数枚举一遍,只要这些数没被用过,就把它添加到path后面。下面一些细节问题:1.回溯:向上回去时要把最后的元素干了,也要把check标记复原回上层的样子。2.剪枝:check可帮我们剪枝。3.递归出口:遇到叶子结点,直接添加结果。下面来实现(题目最大为6,所以给7 nums):

2.子集

78. 子集 - 力扣(LeetCode)https://leetcode.cn/problems/subsets/description/解法一:1.先想一个决策树。2.根据决策树来设计代码(想一下全局变量、dfs函数体设计、细节问题)。决策树这里先想想如何能不重不漏的把所有子集枚举出来,如nums[1,2,3],子集是这个数组里选或不选某一些数形成的一个新集合就是子集,所以我们可以单独盯着某一个数看选还是不选。开始后可以不选1,可以选1,若不选1相当于得到了一个空集,选1相当于得到了1。接下来在选完的基础上对2进行操作,可以不选2,可以选2。不选2在空集基础上又什么也没选还是空集,在空集基础上选2此时相当于得到了2。在选1的基础上也可以不选或选2,不选2得到了1,选2得到了1,2……:

这样在决策树叶子结点中最终得到的都是子集。下面仅需把决策树转化为代码,既然要在叶子结点收集信息,仅需记录一下路径中我们选择的东西,所以要有个全局的path,int[] path;还需要有一个int[][]ret来记录结果。dfs设计盯着某一个位置看干什么事情,任意一个位置再考虑下一次那个数选还是不选,所以dfs不仅要有数组,还要知道当前要选哪个位置 dfs[nums,i],dfs干的是在数组中I位置的数选还是不选。若选了path+=nums[i]再到下一层,不选择则直接dfs(nums,i+1)到下一层dfs。下面再考虑一些细节问题:这里不存在剪枝,弄全局的path回溯时记得恢复现场,当在某一层添加完元素进入到了下一层,当在这一层向上返回时要把添加的干了。出口:到叶子节点这一层就可以向上返回了,也就是i==nums.size时,此时把path放ret里。

解法二:1.画决策树。2.设计代码(关注全局、dfs)。如nums[1,2,3],此时换一种思考方式:当子集里只有0个,1个,2个,3个元素时。刚开始是空集,当子集里只有一个元素时可选1选2选3,此时得到子集1,子集2,子集3。当子集里有2个元素时,就是在之前基础上多添加一个元素,1的基础上可多添2,3;2的基础上可多添3;3的基础上什么也不能选……当子集有三个元素时可在1,2基础上选3:

每次选数时都是从已选数的后面开始选,我们进入递归时此时的路径就是一个结果(决策树每个结点都是我们想要的结果)。下面来设计:全局变量int[]path,int[][]ret。dfs:每个结点是从当前位置开始,向后开始依次枚举,所以dfs(nums,pos),从pos开始枚举。这里没有剪枝,没有出口,进入函数就添加结果。

下面来实现:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 21:43:34

暗黑破坏神2存档编辑器:5分钟学会可视化修改角色与物品

暗黑破坏神2存档编辑器:5分钟学会可视化修改角色与物品 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor d2s-editor是一款专为《暗黑破坏神2》及其重制版玩家设计的开源存档编辑器,通过直观的可视化界面&a…

作者头像 李华
网站建设 2026/6/24 21:45:41

水质参数TDS、电导率与硬度的工程测量原理及嵌入式应用实践

1. 从“水”说起:为什么工程师需要关注水质参数?干了这么多年硬件和嵌入式开发,从画板子、调代码到整机测试,踩过的坑不计其数。很多朋友可能觉得,水质参数像TDS、电导率这些,那是搞环境工程或者化学分析的…

作者头像 李华
网站建设 2026/6/24 21:46:31

从单梁到多梁:石英谐振压力传感器如何满足核安全监测的极端需求

1. 核安全监测的“感知神经”:为何压力传感器是命门在核工业这个对安全要求近乎苛刻的领域,监测系统扮演着“永不疲倦的哨兵”角色。它的核心任务,用业内的话说,就是“预警、防控、溯源”——在异常发生前捕捉蛛丝马迹&#xff0c…

作者头像 李华
网站建设 2026/6/24 23:03:25

FPGA时序分析实战:从TimeQuest波形图到SDC约束的完整指南

1. 项目概述:从“玄学”到“科学”的FPGA时序分析之路如果你在FPGA设计里摸爬滚打过一阵子,肯定对“时序违例”这四个字又爱又恨。爱的是,它告诉你设计跑不快了;恨的是,那一堆报告里的Launch Edge、Latch Edge、Data A…

作者头像 李华
网站建设 2026/6/24 23:03:47

工程师如何评估技术职场健康度:从明星项目陷阱到可持续成长

1. 项目概述:一次迟来的职场复盘在机场候机,百无聊赖,看着窗外起落的航班,思绪很容易被拉回到十几二十年前。十年前,也是在一次出差途中,我偶遇了职业生涯的第一位领导,聊起当年那家一度被视作“…

作者头像 李华