系统学习算法:专题九 穷举vs暴搜vs深搜vs回溯vs剪枝

其中标题的深搜,回溯,剪枝我们之前专题都已经有过学习和了解,这里多了两个穷举和暴搜,其实意思都差不多,穷举就是穷尽力气将所有情况都列举出来,暴搜就是暴力地去一个一个情况搜索,所以就是全部遍历的意思

而实现全部遍历之前,我们需要将所有情况以树状来大致画出来,这棵树就叫做决策树,也就是在上学时数学的某一小节学过的决策树,如下图

将123的所有排列情况列举出来

 就是填空一样,将不同情况画出树

那么这就涉及深搜,回溯和剪枝,只不过之前是二叉树,现在变为了多叉树

但过程都大致差不多,只要画出清晰的决策树,就可以将决策转化为代码

题目一:

 思路:

先画出决策树,就是上面我们举例的决策树

 其中我们需要一个全局变量二维数组ret来存储所有排列的情况,也是我们要返回的结果集

然后我们还需要一个全局变量一维数组path来记录其中一次的排列情况,也就做其中一条路径

然后还需要一个全局变量布尔数组来记录数字的使用情况,没使用过为false,使用过为true

然后我们就开始遍历,但注意我们是深搜dfs,不是宽搜bfs,即虽然画决策树的时候是先填第一个空1,2,3,但实际遍历我们是填1之后,将1对应的所有情况都搜索完之后,再回到2这里,即dfs的搜索顺序,而不是bfs

结束条件也很好想,就是当path的元素个数等于数组元素个数就说明排完了,那么就将该path填入结果集ret中(但注意path要重新new一个出来,不然传的是地址,后续搜索其他排列时,对path修改会连带着修改之前填入的path,即所有path都指向同一个path),填入之后还可以用剪枝稍微优化一下,因为填就说明全部元素用到了,后面的其他元素都没必要再搜索了,因为结果都是不可能的

而往下遍历的时候都是for循环数组的所有元素,调用布尔数组,如果该元素用过就不加,没用过就加,然后继续往下搜索

碰到结束条件后就该回溯,那么就该修改布尔数组和path,将该数的布尔值修改为false,再删除path的最后一个元素

最后返回ret即可

代码:

class Solution {//保存所有全排列的结果集List<List<Integer>> ret=new ArrayList<>();//用于判断该数字是否使用过boolean[] check;//其中一个排列List<Integer> path=new ArrayList<>();public void dfs(int[] nums){//如果排列元素的个数等于数组元素的个数,说明排完了if(path.size()==nums.length){//添加该排列情况(要new一个新的,不然就是传地址)ret.add(new ArrayList<>(path));//剪枝return;}//遍历数组for(int i=0;i<nums.length;i++){//如果当前元素没有使用过if(check[i]==false){//添加该情况path.add(nums[i]);//标记该元素使用过check[i]=true;//选择下一个元素dfs(nums);//回溯,该元素修改为没使用check[i]=false;//删除该元素path.remove(path.size()-1);}}}public List<List<Integer>> permute(int[] nums) { check=new boolean[nums.length];dfs(nums);return ret;}
}

题目二:

思路:

还是先画决策树,不同的决策树画法有不同的代码,但只要决策树画对,代码实现了就一定是对的

 求子集大概有两种决策树画法

解法1:

 这种决策树画法就是遍历数组,每遍历一个就出现两种决策,选或者不选,最后叶子结点就是所有的子集

代码1:

class Solution {//结果集List<List<Integer>> ret = new ArrayList<>();//其中一个子集List<Integer> path = new ArrayList<>();//k表示到数组的哪一个元素了public void dfs(int[] nums, int k) {//如果遍历完数组了if(k==nums.length){ret.add(new ArrayList<>(path));return;}//选path.add(nums[k]);dfs(nums,k+1);//恢复现场path.remove(path.size()-1);//不选dfs(nums,k+1);}public List<List<Integer>> subsets(int[] nums) {dfs(nums, 0);return ret;}
}

解法2:

这种决策树的画法就是以子集中的元素个数来进行决策,一开始为0个,也就是空集,然后为1个,就是1,2,3,再然后为2个……其中是否选择以当前元素的位置为标准,比如1就找后面的2,3,而2就找后面的3,而3就没得找了,这样子就能避免出现重复的情况

则每一个结点都是一个结果,所以每次dfs的时候都要添加

代码2:

class Solution {//结果集List<List<Integer>> ret = new ArrayList<>();//其中一个子集List<Integer> path = new ArrayList<>();//k表示到数组的哪一个元素了public void dfs(int[] nums, int k) {//先添加ret.add(new ArrayList<Integer>(path));//从当前元素开始往后遍历for (int i = k; i < nums.length; i++) {//添加该元素path.add(nums[i]);//再次基础上往后遍历dfs(nums, i + 1);//恢复现场path.remove(path.size() - 1);}}public List<List<Integer>> subsets(int[] nums) {dfs(nums, 0);return ret;}
}

但综合来看,肯定是解法2更优,因为每一个结点都是结果,没有多余的浪费,而解法1则全部枚举了出来,但最后只选择了叶子结点,非叶子结点就多余了

总结:

解决全排列,集合这种需要枚举许多情况并回溯的,先画出决策树,决策树不唯一,只要思路是对的,通过代码来实现,其中需要注意回溯后要恢复现场,最后就是正确的

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

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

相关文章

人类心智逆向工程:AGI的认知科学基础

文章目录 引言:为何需要逆向工程人类心智?一、逆向工程的定义与目标1.1 什么是逆向工程?1.2 AGI逆向工程的核心目标二、认知科学的四大支柱与AGI2.1 神经科学:大脑的硬件解剖2.2 心理学:心智的行为建模2.3 语言学:符号与意义的桥梁2.4 哲学:意识与自我模型的争议三、逆向…

VLAN 基础 | 不同 VLAN 间通信实验

注&#xff1a;本文为 “ Vlan 间通信” 相关文章合辑。 英文引文&#xff0c;机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信&#xff1f; Posted on November 20, 2015 by RouterSwi…

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录 说明 通常分为两种类型&#xff1a; 本地文件包含 典型的攻击方式1&#xff1a; 影响&#xff1a; 典型的攻击方式2&#xff1a; 包含路径解释&#xff1a; 日志包含漏洞&#xff1a; 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…

蓝桥杯更小的数(区间DP)

题目描述 小蓝有一个长度均为 n 且仅由数字字符 0 ∼ 9 组成的字符串&#xff0c;下标从 0 到 n − 1&#xff0c;你可以将其视作是一个具有 n 位的十进制数字 num&#xff0c;小蓝可以从 num 中选出一段连续的子串并将子串进行反转&#xff0c;最多反转一次。小蓝想要将选出的…

洛谷 P1387 最大正方形 C语言

题目描述 在一个 n m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形&#xff0c;输出边长。 输入格式 输入文件第一行为两个整数 n, m (1 ≤ n, m ≤ 100)&#xff0c;接下来 n 行&#xff0c;每行 m 个数字&#xff0c;用空格隔开&#xff0c;0 或 1。 输出格式 …

算法与数据结构(括号匹配问题)

思路 从题干可以看出&#xff0c;只要给出的括号对应关系正确&#xff0c;那么就可以返回true,否则返回false。这个题可以使用栈来解决 解题过程 首先从第一个字符开始遍历&#xff0c;如果是括号的左边&#xff08;‘&#xff08;‘&#xff0c;’[‘&#xff0c;’}‘&…

硬件产品经理:需求引力模型(DGM)

目录 1、DGM 模型简介 2、理论核心&#xff1a;打破传统线性逻辑 3、三大定律 第一定律&#xff1a;暗物质需求法则 第二定律&#xff1a;引力井效应 第三定律&#xff1a;熵减增长律 4、落地工具包 工具1&#xff1a;需求密度热力图 工具3&#xff1a;摩擦力歼灭清单…

小书包:让阅读更美的二次开发之作

小书包是在一款知名阅读软件的基础上进行二次开发的产品。在保留原有软件的基本功能和用户体验的同时&#xff0c;对其界面和视觉效果进行了精心美化&#xff0c;让阅读体验更加舒适和愉悦。 内置了171条书源&#xff0c;虽然数量不算多&#xff0c;但都是作者精挑细选出来的&a…

openRv1126 AI算法部署实战之——Tensorflow模型部署实战

在RV1126开发板上部署Tensorflow算法&#xff0c;实时目标检测RTSP传输。视频演示地址 rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili ​ 一、准备工作 从官网下载tensorflow模型和数据集 手动在线下载&#xff1a; https://github.com/tensorflow/models/b…

蓝桥与力扣刷题(141 环形链表)

题目&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的…

【生成模型之十三】SmartEraser

论文&#xff1a;SmartEraser: Remove Anything from Images using Masked-Region Guidance 代码&#xff1a; https://github.com/longtaojiang/SmartEraser 类型&#xff1a;fine-tuned diffusion model 其他&#xff1a;支持简历修改面试辅导 一、背景 到目前为止&#…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测&#xff0c;到 2025 年全球 AI 安全解决方案市场规模将突破 200 亿美元&#xff0c;年复合增长率超过 30%&#xff0c;而…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来&#xff0c;生成式 AI 安全市场正迅速发展。据 IDC 预测&#xff0c;到 2025 年全球 AI 安全解决方案市场规模将突破 200 亿美元&#xff0c;年复合增长率超过 30%…

mysql运维

1、msyqlLinux通用二进制安装 1. MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/https://downloads.mysql.com/archives/community/https://downloads.mysql.com/archives/community/https://downloads.mysql…

蓝桥杯刷题DAY3:Horner 法则 前缀和+差分数组 贪心

所谓刷题&#xff0c;最重要的就是细心 &#x1f4cc; 题目描述 在 X 进制 中&#xff0c;每一数位的进制不固定。例如&#xff1a; 最低位 采用 2 进制&#xff0c;第二位 采用 10 进制&#xff0c;第三位 采用 8 进制&#xff0c; 则 X 进制数 321 的十进制值为&#xff…

使用VCS对Verilog/System Verilog进行单步调试的步骤

Verilog单步调试&#xff1a; System Verilog进行单步调试的步骤如下&#xff1a; 1. 编译设计 使用-debug_all或-debug_pp选项编译设计&#xff0c;生成调试信息。 我的4个文件&#xff1a; 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;alwa…

【单层神经网络】softmax回归的从零开始实现(图像分类)

softmax回归 该回归分析为后续的多层感知机做铺垫 基本概念 softmax回归用于离散模型预测&#xff08;分类问题&#xff0c;含标签&#xff09; softmax运算本质上是对网络的多个输出进行了归一化&#xff0c;使结果有一个统一的判断标准&#xff0c;不必纠结为什么要这么算…

Docker使用指南(一)——镜像相关操作详解(实战案例教学,适合小白跟学)

目录 1.镜像名的组成 2.镜像操作相关命令 镜像常用命令总结&#xff1a; 1. docker images 2. docker rmi 3. docker pull 4. docker push 5. docker save 6. docker load 7. docker tag 8. docker build 9. docker history 10. docker inspect 11. docker prune…

【25考研】南开软件考研复试复习重点!

一、复试内容 复试采取现场复试的方式。复试分为笔试、机试和面试三部分。三部分合计100分&#xff0c;其中笔试成绩占30%、机试成绩占30%、面试成绩占40%。 1.笔试&#xff1a;专业综合基础测试 考核方式&#xff1a;闭卷考试&#xff0c;时长为90分钟。 笔试考查内容范围…

Codeforces Round 1002 (Div. 2)(部分题解)

补题链接 A. Milya and Two Arrays 思路&#xff1a;题意还是比较好理解&#xff0c;分析的话我加了一点猜的成分&#xff0c;对a&#xff0c;b数组的种类和相加小于4就不行&#xff0c;蒋老师的乘完后小于等于2也合理。 AC代码&#xff1a; #include <bits/stdc.h> u…