多路递归的一些算法题

前言

首先我想讲一下,我对多路递归的理解吧,我认为多路递归就是循环中套回调,对于循环有几次就是几叉树,就好比我们常用的二叉树的dfs(node.left) 和 dfs(node.right)等前中后序遍历,也就是for (int i = 0; i < 2; i++) { TreeSet node = i == 0 ? node.left : node.right; dfs(node); }就是一个循环两次的for循环。实在无法理解就画图,好比二叉树画四个方格,1为递归出口,2为左指针,3为右指针,4回溯返回的结果

全排列

这一题也就是高中的排列组合,填空问题,n!。第一个空从n个数选一个,第二个空选除第一个空以外的数 n - 1 依次类推

全排列的链接

https://leetcode.cn/problems/VvJkup/icon-default.png?t=N7T8https://leetcode.cn/problems/VvJkup/

思路分析: 多路递归 + 回溯 + 剪枝 + 引入三个全局变量

多路递归:有几个数树分几个叉

回溯: 归的时候,返回我们修改前的状态

剪枝: 剪掉不需要的,比如遍历了A了下次就不要处理A了 

全局变量 result: 返回最终的结果

                temp:存放到叶子结点的值

                cheak:判断该元素是否枚举过了(剪枝)

这些说明代码注释里面都介绍了!

关于123的全排列的决策树 

public class MyTest1 {private List<List<Integer>> result;private List<Integer> temp;//存放枚举的结果private boolean[] cheak;//判断是否已经枚举过了public List<List<Integer>> permute(int[] nums) {result = new ArrayList<>();temp = new ArrayList<>();cheak = new boolean[nums.length];dfs(nums);return result;}//深搜(枚举) + 回溯(恢复现场) + 剪枝(cheak变量标记是否不需要遍历)private void dfs(int[] nums) {//递归出口if (temp.size() == nums.length){result.add(new ArrayList<>(temp));return;}for (int i = 0; i < nums.length; i++) {if (!cheak[i]) {temp.add(nums[i]);cheak[i] = true;dfs(nums);//递归完毕,进行回溯的时候说明已经是搞完了再往上返回//恢复现场cheak[i] = false;temp.remove(temp.size() - 1);}}}
}

子集

子集就是也是高中数学的基础知识,比如 1 2 的子集是{空集},{1},{2},{1,2},其实就是子序列也就是不去重的子集。

. - 力扣(LeetCode)

 思路分析:  这一题主要有两种解法,但是本博客就介绍一种

             解法一:双路递归的二叉分为选和不选

全局变量 + 多路递归 + 回溯  没有剪枝(因为只有选不选,不会出现枚举重复元素)

全局变量path: 递了总集的元素次结束,存放

二路递归:选或者不选,来分为二叉树

回溯:选的时候,往上归的时候要恢复现场

注释我都详解了。

             解法二:按照子集个数分,比如空集是个数为0

解法一的决策树

 解法二的决策树

注意这是解法一的代码,我并没有写解法二的代码 

package study2.day10;import java.util.ArrayList;
import java.util.List;//子集
public class MyTest5 {private List<Integer> path;//定义叶子结点存的内容private List<List<Integer>> result;//返回值public List<List<Integer>> subsets(int[] nums) {path = new ArrayList<>();result = new ArrayList<>();dfs(nums, 0);return result;}private void dfs(int[] nums, int index) {if (index == nums.length) {result.add(new ArrayList<>(path));return;}// 不选择当前元素dfs(nums, index + 1);// 选择当前元素path.add(nums[index]);dfs(nums, index + 1);path.remove(path.size() - 1);//回溯(恢复状态)}public static void main(String[] args) {new MyTest5().subsets(new int[]{1,2,3});}
}

 岛屿数量

岛屿数量也就是抱团1的数量,其中1表示地面,0表示海洋,这个是不是很像围棋,1没有气了就是一个岛了。这个题,其实和我写的博客(腐烂的苹果题目一样)但是我还是写错了,这个和那个唯一的区别,就是那个是同时扩散的bfs,这个是单个遍历的dfs

 http://t.csdnimg.cn/q9PFM  这是腐烂苹果博客的链接

 思路分析: 

                解法一:bfs

                解法二:dfs

解法一: bfs也就是借助了队列这个数据结构来保证回调的顺序

        1.创建一个队列(queue)用来保存回调的顺序

        2.遇到 1 入队列,并且标记这个元素已经被扫描过了 vis[i][j] = true

        3.队列不为空表示四周有陆地,继续将陆地并且没有被扫描过添加入队列继续遍历

解法二:dfs就是使用让计算机中的栈内存来当一个栈的数据结构供你使用

        1.遇到1,进入递归的dfs并且标记为被扫描

        2.和上述3一样就不一一介绍了

公共代码都一样只不过是调用的函数不一样: 

公共代码

 int[] dx = {0, 0, -1, 1};int[] dy = {1, -1, 0, 0};boolean[][] vis = null;//判断是否判断过int m = 0;char[][] grid = null;int n = 0;public int solve (char[][] grid) {this.grid = grid;m = grid.length;n = grid[0].length;int count = 0;vis = new boolean[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!vis[i][j] && grid[i][j] == '1'){bfs(vis, i, j);//逐个遍历count++;}}}return count;}

解法一代码:

//解法一的bfs代码private void bfs(boolean[][] vis, int i, int j) {Queue<int[]> queue = new LinkedList<>();queue.offer(new int[]{i,j});vis[i][j] = true;while(!queue.isEmpty()){int[] arr = queue.poll();int a = arr[0], b = arr[1];for (int k = 0; k < 4; k++) {int x = a + dx[k], y = b + dy[k];if (x >= 0 && y >= 0 && x < m && y < n && !vis[x][y] &&  grid[x][y] == '1'){queue.offer(new int[]{x, y});vis[x][y] = true;}}}}

解法二代码:

 //深搜,全部的1都搜索private void dfs(boolean[][] vis, int i, int j) {vis[i][j] = true;for (int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k];if (x >= 0 && y >= 0 && x < m && y < n && !vis[x][y] &&  grid[x][y] == '1'){dfs(vis, x, y);}}}

总结

非常感谢您的支持和鼓励!制作博客确实需要付出很多心血,尤其是分享个人经验和解决问题的方法。如果我的回答对您有帮助,我会很高兴为您点个三连。另外,祝您周末愉快,愿您的每一天都充满快乐和成就!

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

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

相关文章

zabbix6.4告警配置(短信告警和邮件告警),脚本触发

目录 一、前提二、告警配置1.邮件告警脚本配置2.短信告警脚本配置3.zabbix添加报警媒介4.zabbix创建动作4.给用户添加报警媒介 一、前提 已经搭建好zabbix-server 在需要监控的mysql服务器上安装zabbix-agent2 上述安装步骤参考我的上篇文章&#xff1a;通过docker容器安装za…

新时代凌迟:考研

我不喜欢上班&#xff0c;但我很欣赏老板的品味&#xff0c;因为咱们公司竟然还在订阅报纸&#xff0c;而且只有一份&#xff0c;《中国青年报》。 这份报纸我最喜欢看的是“冰点周刊”专栏&#xff0c;因为这个栏目能让读者相信&#xff1a;报纸远远可以超越一天的生命。 昨天…

Windows安装Elasticsearch 7.9.2

1 下载 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.2-windows-x86_64.zip 2 配置 进入config目录&#xff0c;打开elasticsearch.yml文件&#xff0c;给集群和节点配置名称。 cluster.name: my-es node.name: node-1 3 启动 打开bin目录&am…

CyberData统一元数据服务

CyberData统一元数据服务功能完善&#xff0c;实现了湖仓平台元数据在整个平台的统一管理以及外部数据源元数据的主动发现和多计算引擎间元数据的互通互联。 同时&#xff0c;我们支持跨多元计算场景&#xff0c;以及在元数据基础上的统一数据权限管理和数据湖的自动化优化加速…

【Win】PsPing:深入网络性能测试与故障排查

在维护 Azure 虚拟机的过程中&#xff0c;可能会遇到一些网络连通性的问题。例如&#xff0c;当您尝试从个人 PC 上 ping 虚拟机的公网 IP 地址时&#xff0c;可能会发现出现 “Request time out” 的信息&#xff0c;导致无法 ping 通。这种情况的发生&#xff0c;通常是因为在…

plsql 新建sql窗口 初始化慢的问题

问题描述&#xff1a; 新建sql窗口当sql语句多的情况下初始化很慢。 解决方法&#xff1a; 采用导入表的方式。 具体方式 工具->导入表->sql插入。 使用命令窗口 导入文件&#xff0c;然后点击导入按钮。

Typora for Mac:轻量级Markdown编辑器

Typora for Mac是一款专为Mac用户设计的轻量级Markdown编辑器&#xff0c;它以其简洁的界面和强大的功能&#xff0c;成为了Markdown写作爱好者的首选工具。 Typora for Mac v1.8.10中文激活版下载 Typora的最大特色在于其所见即所得的编辑模式&#xff0c;用户无需关心复杂的M…

为什么 Facebook 不使用 Git?

在编程的世界里&#xff0c;Git 就像水一样常见&#xff0c;以至于我们认为它是创建和管理代码更改的唯一可行的工具。 前 Facebook 员工&#xff0c;2024 年 首先&#xff0c;我为什么关心&#xff1f; 我致力于构建 Graphite&#xff0c;它从根本上受到 Facebook 内部工具的…

Java | Leetcode Java题解之第52题N皇后II

题目&#xff1a; 题解&#xff1a; class Solution {public int totalNQueens(int n) {Set<Integer> columns new HashSet<Integer>();Set<Integer> diagonals1 new HashSet<Integer>();Set<Integer> diagonals2 new HashSet<Integer>…

【Diffusion实战】训练一个diffusion模型生成蝴蝶图像(Pytorch代码详解)

上一篇Diffusion实战是确确实实一步一步走的公式&#xff0c;这回采用一个更方便的库&#xff1a;diffusers&#xff0c;来实现Diffusion模型训练。 Diffusion实战篇&#xff1a;   【Diffusion实战】训练一个diffusion模型生成S曲线&#xff08;Pytorch代码详解&#xff09;…

web题目实操 5(备份文件和关于MD5($pass,true)注入的学习)

1.[ACTF2020 新生赛]BackupFile &#xff08;1&#xff09;打开页面后根据提示是备份文件 &#xff08;2&#xff09;查看源码发现啥都没有 &#xff08;3&#xff09;这里啊直接用工具扫描&#xff0c;可以扫描到一个文件名为&#xff1a;/index.php.bak的文件 &#xff08;…

ArcGIS Pro 和 Python — 分析全球主要城市中心的土地覆盖变化

第一步——设置工作环境 1–0. 地理数据库 在下载任何数据之前,我将创建几个地理数据库,在其中保存和存储所有数据以及我将创建的后续图层。将为我要分析的五个城市中的每一个创建一个地理数据库,并将其命名为: “Phoenix.gdb” “Singapore.gdb” “Berlin.gdb” “B…

安卓悬浮窗权限检查

目录 悬浮窗权限代码检测悬浮窗功能 悬浮窗权限 请求了这个权限后&#xff0c;app的权限管理中会有「显示悬浮窗」的权限选项。后面会引导用户去开启这个权限。 <uses-permission android:name"android.permission.SYSTEM_ALERT_WINDOW" />代码检测悬浮窗功能…

Windows系统下将MySQL数据库表内的数据全量导入Elasticsearch

目录 下载安装Logstash 配置Logstash配置文件 运行配置文件 查看导入结果 使用Logstash将sql数据导入Elasticsearch 下载安装Logstash 官网地址 选择Windows系统&#xff0c;需下载与安装的Elasticsearch相同版本的&#xff0c;下载完成后解压安装包。 配置Logstash配…

贪吃蛇大作战【纯c语言】

如果有看到不懂的地方或者对c语言某些知识忘了的话&#xff0c;可以找我之前的文章哦&#xff01;&#xff01;&#xff01; 个人主页&#xff1a;小八哥向前冲~-CSDN博客 所属专栏&#xff1a;c语言_小八哥向前冲~的博客-CSDN博客 贪吃蛇游戏演示&#xff1a; 贪吃蛇游戏动画演…

第一阶段--Day2--信息安全法律法规、网络安全相关标准

目录 1. 针对信息安全的规定 2. 网络安全相关标准 1. 针对信息安全的规定 《中华人民共和国计算机信息系统安全保护条例》1994年2月18日颁布并实施 中华人民共和国计算机信息系统安全保护条例__增刊20111国务院公报_中国政府网 《中华人民共和国国际联网安全保护管理…

笔记:编写程序,分别采用面向对象和 pyplot 快捷函数的方式绘制正弦曲线 和余弦曲线。 提示:使用 sin()或 cos()函数生成正弦值或余弦值。

文章目录 前言一、面向对象和 pyplot 快捷函数的方式是什么&#xff1f;二、编写代码面向对象的方法&#xff1a;使用 pyplot 快捷函数的方法&#xff1a; 总结 前言 本文将探讨如何使用编程语言编写程序&#xff0c;通过两种不同的方法绘制正弦曲线和余弦曲线。我们将分别采用…

图像处理ASIC设计方法 笔记18 轮廓跟踪算法的硬件加速方案

目录 1排除伪孤立点(断裂链表)方法1 限制链表的长度方法2 增加判断条件排除断裂链表方法3 排除不必要跟踪的轮廓(推荐用这个方法)P129 轮廓跟踪算法的硬件加速方案 1排除伪孤立点(断裂链表) 如果图像中某区域存在相邻像素之间仅有对角连接的部位,则对包围该区域的像素…

SOLIDWORKS Electrical 3D--精准的三维布线

相信很多工程师在实际生产的时候都会遇到线材长度不准确的问题&#xff0c;从而导致线材浪费甚至整根线材报废的问题&#xff0c;这基本都是由于人工测量长度所导致的&#xff0c;因此本次和大家简单介绍一下SOLIDWORKS Electrical 3D布线的功能&#xff0c;Electrical 3D布线能…

伙伴匹配(后端)-- 用户登录

文章目录 登录逻辑设计登录业务代码实现用户登录态如何知道是哪个用户登录了&#xff1f;cookie与session 逻辑删除配置添加TableLogic注解 &#xff08;现在做单机登录&#xff09; 后面修改为redis单点登录 登录逻辑设计 接收参数&#xff1a;用户接账户&#xff0c;密码 请…