【算法篇】三道题理解算法思想——认识BFS

BFS(宽搜)

        宽度优先遍历和深度优先遍历组成了大家熟悉的搜索算法,这两种算法也是蓝桥杯之类竞赛题的常考思想,正巧马上蓝桥杯临近,博主也是刷了很多BFS相关的题型,在这篇文章中会从力扣上选取三道简单的宽搜题型,带大家了解BFS的模板以及对他有个初步认识。

        本篇文章题目较为简单,大家可以根据第一题的模板,自己先去力扣上做题然后回来看题解,稍后我们继续更新难度更高的宽搜题目,希望大家能给个关注👍。

文章顺序:

 题目链接-》算法思路-》代码呈现。

算法摘要:

 宽度优先遍历是一种利用队列这种数据结构,从某一点开始,一层一层进行遍历的一种算法思想,而BFS(宽搜)实际上就是一种暴力搜索算法,利用宽度优先遍历来查找想要结果。

1.N叉树的层序遍历

题目链接:

https://leetcode.cn/problems/n-ary-tree-level-order-traversal/description/

算法思路:

仅需多加⼀个变量,⽤来记录每⼀层结点的个数,然后层序遍历即可。

代码展示:

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) {val = _val;}public Node(int _val, List<Node> _children) {val = _val;children = _children;}
};
*/class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> lists=new ArrayList<>();if(root==null){return lists;}Queue<Node> q=new LinkedList<Node>();q.add(root);while(!q.isEmpty()){int sz=q.size();List<Integer> list=new ArrayList<>();for(int i=0;i<sz;i++){Node cur=q.poll();list.add(cur.val);for(Node c:cur.children){if(c!=null){q.add(c);}}}lists.add(list);}return lists;}
}

 2.二叉树的最大宽度

题目链接:

https://leetcode.cn/problems/maximum-width-of-binary-tree/description/

算法思路:

依旧是利⽤层序遍历,但是这⼀次队列⾥⾯不单单存结点信息,并且还存储当前结点如果在数组中存 储所对应的下标(在我们学习数据结构 - 堆的时候,计算左右孩⼦的⽅式)。
这样我们计算每⼀层宽度的时候,⽆需考虑空节点,只需将当层结点的左右结点的下标相减再加 1 即可。
但是,这⾥有个细节问题:如果⼆叉树的层数⾮常恐怖的话,我们任何⼀种数据类型都不能存下下标的值。但是没有问题,因为
我们数据的存储是⼀个环形的结构;
并且题⽬说明,数据的范围在 int 这个类型的最⼤值的范围之内,因此不会超出⼀圈;
因此,如果是求差值的话,我们⽆需考虑溢出的情况。

代码展示:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public int widthOfBinaryTree(TreeNode root) {if(root==null){return 0;}int max=1;Queue<Pair<TreeNode,Integer>> q=new LinkedList<>();q.add(new Pair(root,1));while(!q.isEmpty()){int sz=q.size();int head=0,last=0;for(int i=0;i<sz;i++){Pair<TreeNode,Integer> p=q.poll();TreeNode cur=p.getKey();int v=p.getValue();if(cur.left!=null){q.add(new Pair(cur.left,v*2));}if(cur.right!=null){q.add(new Pair(cur.right,v*2+1));}if(i==0){head=v;}if(i==(sz-1)){last=v;}}max=max>(last-head+1)?max:(last-head+1);}return max;}
}

3.在每个树行中找最大值

题目链接:

515. 在每个树行中找最大值 - 力扣(LeetCode)

算法思路:

层序遍历过程中,在执⾏让下⼀层节点⼊队的时候,我们是可以在循环中统计出当前层结点的最⼤值的。
因此,可以在 bfs 的过程中,统计出每⼀层结点的最⼤值。

代码展示:

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public List<Integer> largestValues(TreeNode root) {List<Integer> list=new ArrayList<>();if(root==null){return list;}Queue<TreeNode> q=new LinkedList<>();q.add(root);while(!q.isEmpty()){int sz=q.size();int max=Integer.MIN_VALUE;for(int i=0;i<sz;i++){TreeNode cur=q.poll();if(cur.left!=null){q.add(cur.left);}if(cur.right!=null){q.add(cur.right);}max=max>cur.val?max:cur.val;}list.add(max);}return list;}
}

 ❤️😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍😍

🍔我是小皮侠,谢谢大家都能看到这里!!

🦚主页已更新Java基础内容,数据结构基础,数据库,算法

🚕未来会更新Java项目,SpringBoot,Redis以及各种Java路线会用到的技术。

🎃求点赞!求收藏!求评论!求关注!

🤷‍♀️谢谢大家!!!!!!!!!

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2upjellgk3eow

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

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

相关文章

一键无痕清理:高效删除Mac文件夹,释放宝贵存储空间

在当今重视隐私的时代&#xff0c;当转让或出借Mac电脑时&#xff0c;确保个人文件和敏感信息彻底清除至关重要。常规删除Mac上的文件和文件夹仅使数据看似消失&#xff0c;实际上它们仍驻留在硬盘上&#xff0c;存在被数据恢复软件找回的风险。为实现不可逆的删除效果&#xf…

【Linux】指令

1. 简单指令 whoami 显示当前登入账号名 ls /home 现在有的用户名 adduser 用户名 新加用户&#xff08;必须在root目录下&#xff09; passwd 用户名 给这个用户设置密码 userdel -r 用户名 删除这个用户 pwd 显示当前所处路径 stat 文件名 / 文件夹名 显示文件状…

c++ 数值计算<cmath>头文件介绍

<cmath> 是 C 标准库中的头文件&#xff0c;它提供了一系列数学函数和常量&#xff0c;用于执行各种数学计算。在 C 中&#xff0c;<cmath> 头文件中定义的函数和常量都位于 std 命名空间中。 以下是 <cmath> 头文件中常用的一些函数和常量&#xff1a; 常…

五分钟快速搭建五金行业小程序商城教程解析

作为五金行业的从业者&#xff0c;你可能想要拓展线上业务&#xff0c;提供更方便快捷的购物体验给顾客。而小程序商城成为了一种非常受欢迎的方式。但是&#xff0c;你可能觉得不懂代码无法实现这样的小程序商城。现在&#xff0c;我将通过以下步骤&#xff0c;教你如何在五分…

【JVM性能调优】- 年老代-提升速率

一、JVM垃圾收集相关调优策略 在JVM垃圾收集相关的调优实践中&#xff0c;通常都是以最优吞吐量和最短停顿时间来评价JVM的性能&#xff1a;吞吐量越高代表性能越好、暂停时间越短也代表越好。那么如何做到这两点呢&#xff1f;核心思想在于&#xff1a; 尽可能让对象在新生代…

模型CLIP-ViT-B-32-IMAGE.zip

模型CLIP-ViT-B-32-IMAGE.zip

TikTok防关联封号及操作需注意什么?

现在Tiktok对账户的管控一直非常严格。在运营Tiktok账户时&#xff0c;应该注意哪些方面来减少账户损失&#xff1f;以下是几个账户可能出现问题的原因。 网络环境问题 1.Tiktok账户对账户有严格的控制。我们经营Tiktok账户&#xff0c;手机应该模拟海外环境。一旦平台发现我…

全网短剧搜索前端源码开源分享可改自己的接口

全网短剧搜索前端源码 内含7000短剧资源(不支持在线播放&#xff09; 源码全开源&#xff0c;可以修改成自己的接口 178、226、347行修改 源码免费下载地址抄笔记 (chaobiji.cn)https://chaobiji.cn/

【算法】求平方根 - 二分法/牛顿迭代

题目 求一个数的平方根&#xff0c;要求返回小于等于平方根的正整数。 原理 二分法 遍历每次取中间数&#xff0c;大了就往小取&#xff0c;小了就往大取&#xff0c;直到取到正确的值。 牛顿迭代 求num的平方根&#xff0c;则是求 num / x 和 x 的均值&#xff0c;这个值…

linux 文件提权|属性修改

文章目录 suid&#xff08;set uid&#xff09;添加文件属性查看文件属性i &#xff08;immutable&#xff09; umask suid&#xff08;set uid&#xff09; 让文件在执行的时候具有属主&#xff08;对应文件 user &#xff09;的权限 chmod 7744 temp.txt 第一位的7表示权限位…

数据库的基本使用

一、数据库的简介 RDBMS简介&#xff1a; Relational Database Management System,通过表来表示关系类型。当前主要使用两种类型的数据库:关系型数据库和非关系型数据库。所谓的关系型数据库RDBMS是建立在关系模型基础上的数据库&#xff0c;借助于集合代数等数学概念和方法来…

全量知识系统 程序详细设计之架构设计:一个信息系统架构

统架构&#xff0c;整体设计分成了三部分--三种方面&#xff1a;信息nformation、系统Syste 原文 以下是对全知系统程序详细设计需要的架构规划的考虑。 全知系统架构是一个信息系统架构&#xff0c;整体设计分成了三部分&#xff08;三种“方面”&#xff09;&#xff1a;信…

蓝桥杯第十三届省赛C++B组(未完)

目录 刷题统计 修剪灌木 X进制减法 【前缀和双指针】统计子矩阵 【DP】积木画 【图DFS】扫雷 李白打酒加强版 DFS (通过64%&#xff0c;ACwing 3/11&#xff09;; DFS(AC) DP&#xff08;AC&#xff09; 砍竹子(X) 刷题统计 题目描述 小明决定从下周一开始努力刷题准…

洛谷 P3512 [POI2010] PIL-Pilots

首先就是对于超时的做法进行展示&#xff0c;这个思路是最原始的思路&#xff0c;也就是用单调队列的板子&#xff0c;用了两次&#xff0c;然后求差值&#xff0c;差值满足条件我们就直接返回这个长度&#xff0c;然后和后面的循环的长度进行相比。 #include<iostream>…

《QT实用小工具·十八》高亮发光按钮控件

1、概述 源码放在文章末尾 该项目实现了高亮发光按钮控件 可设置文本&#xff0c;居中显示。可设置文本颜色。可设置外边框渐变颜色。可设置里边框渐变颜色。可设置背景色。可直接调用内置的设置 绿色、红色、黄色、黑色、蓝色 等公有槽函数。可设置是否在容器中可移动&#…

git应用场景(进阶)

Git场景运用-CSDN博客 专有名词 Workspace&#xff1a;工作区 Index / Stage&#xff1a;暂存区 Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09; Remote&#xff1a;远程仓库HEAD HEAD&#xff0c;指向当前分支最新提交点。所处分支变化&#xff0c;或产生新…

Open CASCADE学习|旋转变换

物体在三维空间中的旋转变换操作通常可以通过三种不同的方式来表示&#xff1a;矩阵&#xff08;Matrix&#xff09;、欧拉角&#xff08;Euler Angles&#xff09;和四元数&#xff08;Quaternion&#xff09;。下面详细解释这三种表示方法。 矩阵&#xff08;Matrix&#xf…

centos后台运行使用nohup命令

nohup ./my_script.sh & nohup命令运行后如何关闭 nohup 命令用于在用户注销系统后继续运行指定的命令。如果您想关闭使用 nohup 运行的进程&#xff0c;您可以使用 kill 命令。 首先&#xff0c;您需要找到 nohup 运行的进程的进程ID&#xff08;PID&#xff09;。可以使…

【云开发笔记No.21】如何建设中台

这里主要讨论一下中台的建设步骤和组织方法。 随着企业业务的快速发展和数字化转型的深入&#xff0c;中台建设成为众多企业追求高效运营和创新发展的关键一环。中台&#xff0c;作为一个集成了业务、数据和技术的共享服务平台&#xff0c;旨在实现资源的统一管理和高效复用。…

C++的并发世界(八)——lock_guard和unique_lock

1.lock_guard lock_guard是C的stl库中的一种互斥量封装嘞&#xff0c;用于保护共享数据&#xff0c;防止多个线程同时访问同一资源而导致的数据竞争问题。&#xff0c;其包括以下成员函数&#xff1a; 函数名作用lock尝试对互斥量进行加锁&#xff0c;如果当前互斥量已经被其他…