深(广)度优先遍历

994. 腐烂的橘子

BFS (广度优先搜索)可以看成是层序遍历。从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4…… 的结点。因此,BFS 可以用来求最短路径问题。BFS 先搜索到的结点,一定是距离最近的结点。

题目要求:返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。实际上就是求腐烂橘子到所有新鲜橘子的最短路径。那么这道题就可以使用 BFS。

class Solution {public int orangesRotting(int[][] grid) {int n = grid.length;int m = grid[0].length;Queue<int[]> queue = new LinkedList<>();// 统计新鲜橘子的数量int count = 0;for(int i=0; i<n; i++){for(int j=0; j<m; j++){if(grid[i][j]==1){count++;}else if(grid[i][j]==2){// 多源头,以所有腐烂的橘子为初始起点,并将它们加入队列queue.add(new int[]{i,j});}}}// 统计层数,也就是最短路径,即本题的最短分钟数int round=0;while(count>0 && !queue.isEmpty()){round++;// 多源头,需要关注这些点的扩散状态 int k = queue.size();for(int i=0; i<k; i++){int[] orange = queue.poll();int r = orange[0];int c = orange[1];// 保证取值在[0,m), [0,n)中if(r-1>=0 && grid[r-1][c]==1){// 不要忽略将其置为腐烂橘子,避免重复计算grid[r-1][c]=2;count--;queue.add(new int[]{r-1,c});}if(r+1<n && grid[r+1][c]==1){grid[r+1][c]=2;count--;queue.add(new int[]{r+1,c});}if(c-1>=0 && grid[r][c-1]==1){grid[r][c-1]=2;count--;queue.add(new int[]{r,c-1});}if(c+1<m && grid[r][c+1]==1){grid[r][c+1]=2;count--;queue.add(new int[]{r,c+1});}}}if(count>0){return -1;}else{return round;}}
}

207. 课程表

考查 拓扑排序:

1.找到入度为0的点,入队

2.从图中删掉入度为0的点,直至全部被删掉。

3.依次删掉的顺序即为拓扑排序的结果。

若课程 a 存在前置课程 b 的话,我们添加一条从 b 到 a 的有向边,同时统计所有点的入度。

当处理完所有的 g[i] 后,将所有的入度为 0 的课程(含义为没有前置课程要求的科目)进行入队操作,跑一遍「拓扑排序」,若所有课程都能顺利出队,说明所有课程都能使完成。

class Solution {public boolean canFinish(int numCourses, int[][] prerequisites) {List<List<Integer>> adjacency = new ArrayList<>();for(int i=0; i<numCourses; i++){adjacency.add(new ArrayList<>());}int[] flags = new int[numCourses];for(int[] cp : prerequisites){adjacency.get(cp[1]).add(cp[0]);}for(int i=0; i<numCourses; i++){if(!dfs(adjacency,flags,i)) return false;}return true;}public boolean dfs(List<List<Integer>> adjacency, int[] flags, int i){// 说明在本轮 DFS 搜索中节点 i 被第 2 次访问,即 课程安排图有环 ,直接返回 Falseif(flags[i]==1) return false;// 说明当前访问节点已被其他节点启动的 DFS 访问,无需再重复搜索,直接返回 True。if(flags[i]==-1) return true;// 标记其被本轮 DFS 访问过flags[i]=1;// 递归访问当前节点 i 的所有邻接节点 j,当发现环直接返回 Falsefor(Integer j : adjacency.get(i)){if(!dfs(adjacency,flags, j)) return false;}// 当前节点所有邻接节点已被遍历,并没有发现环,则将当前节点 flag 置为 −1并返回 Trueflags[i]=-1;return true;}
}

208. 实现 Trie (前缀树)

假定每个节点都有26个孩子节点(因为都是小写字母),将字符串中的字符插入到对应的位置。

还有一个点要明确:节点的值仅仅表示从根节点到本节点的路径构成的字符串是否有效而已。

分两步:

  1. 首先看表示字符串的路径是否存在
  2. 其次看该路径的终点处的节点是否有效
class Trie {// 前缀树的数据结构class TreeNode{boolean val;TreeNode[] children = new TreeNode[26];}private TreeNode root;public Trie() {root = new TreeNode();}public void insert(String word) {TreeNode p = root;for(char c : word.toCharArray()){int i = c - 'a';// 初始化孩子节点if(p.children[i]==null) p.children[i]=new TreeNode();// 将p节点下移p=p.children[i];}// 将字符串最后一个字符置为有效p.val = true;}public boolean search(String word) {TreeNode p = root;for(char c : word.toCharArray()){int i = c - 'a';if(p.children[i]==null) return false;p=p.children[i];}// 路径存在,直接返回该路径的终点处的节点的有效性return p.val;}public boolean startsWith(String prefix) {TreeNode p = root;for(char c : prefix.toCharArray()){int i = c - 'a';if(p.children[i]==null) return false;p=p.children[i];}return true;}
}/*** Your Trie object will be instantiated and called as such:* Trie obj = new Trie();* obj.insert(word);* boolean param_2 = obj.search(word);* boolean param_3 = obj.startsWith(prefix);*/

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

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

相关文章

[HGAME 2022 week1]Matryoshka(古典密码混合)

题目&#xff1a; 直接说方法&#xff1a; 首先这是一段盲文&#xff0c;要先将盲文反转&#xff0c; 然后再用摩斯密码转换 将得到的字符串去掉“,”后&#xff0c;base16解码 在尝试维吉尼亚密码 再用base64解码 然后用凯撒密码 最后栅栏密码&#xff08;22栏&#xff09;

第5章 不确定性与风险分析 作业

第5章 不确定性与风险分析 作业 一单选题&#xff08;共25题&#xff0c;100分&#xff09; (单选题)当产销量( )盈亏平衡点时,销售收入()总成本。 A. 大于,大于 B. 等于,小于 C. 小于,大于 D. 大于,小于 正确答案: A:大于,大于; (单选题)已知单位产品售价为P,年固定成本为F,…

Linux-账号和权限管理

目录 一、管理用户账号 1、用户账号类型 2、UID--身份标识 3、UID的分类 ​4、用户账号文件​ 5、chage-修改账号密码 5.1、chage—使用格式&#xff1a; 5.2、chage—使用参数&#xff1a; ​6、添加用户账号与管理 6.1、useradd—添加用户 6.2、passwd—设置/修改…

【HarmonyOS NEXT】har 包的构建生成过程

Har模块文件结构 构建HAR 打包规则 开源HAR除了默认不需要打包的文件&#xff08;build、node_modules、oh_modules、.cxx、.previewer、.hvigor、.gitignore、.ohpmignore&#xff09;和.gitignore/.ohpmignore中配置的文件&#xff0c;cpp工程的CMakeLists.txt&#xff0c;…

3d隐藏模型为什么就不见了?---模大狮模型网

在3D建模和设计过程中&#xff0c;经常会遇到需要隐藏某些模型的情况。然而&#xff0c;有时候隐藏之后再也找不到这些模型了。这种情况可能让人感到困惑和沮丧。本文将探讨3D隐藏模型后“消失”的原因&#xff0c;并提供一些解决方法&#xff0c;帮助您更好地管理和查找隐藏的…

npm报错:request to https://registry.npm.taobao.org failed处理办法

npm报错&#xff1a;request to https://registry.npm.taobao.org failed处理办法 npm报错&#xff1a;request to https://registry.npm.taobao.org failed, reason certificate has expired 看提示是淘宝镜像过期了。找了一下资料&#xff0c;好像是npm 淘宝镜像已经从 regi…

在Apache Flink中,TableAggregateFunction是一种用户自定义的聚合函数,它允许你实现自定义的聚合逻辑

在Apache Flink中&#xff0c;TableAggregateFunction是一种用户自定义的聚合函数&#xff0c;它允许你实现自定义的聚合逻辑。以下是一个Java代码示例&#xff0c;展示了如何实现和使用TableAggregateFunction。 假设我们想要创建一个简单的表聚合函数&#xff0c;用于计算一…

基于深度学习的图像风格迁移

基于深度学习的图像风格迁移 图像风格迁移&#xff08;Image Style Transfer&#xff09;是一种将一幅图像的风格应用到另一幅图像的方法&#xff0c;使目标图像在保持其原有内容的同时呈现出参考图像的风格。深度学习&#xff0c;特别是卷积神经网络&#xff08;CNN&#xff…

Linux-笔记 g++: internal compiler error: Killed (program cc1plus)报错

前言 编译buildroot的时候报错了&#xff0c;通过查阅资料发现问题可能是编译器进程 cc1plus 被系统终止了。这种情况通常发生在编译过程中消耗了大量的系统资源&#xff0c;特别是内存&#xff0c;而系统为了释放资源而终止了该进程&#xff0c;如系统的物理内存&#xff08;R…

循环的结构

一.简介 循环结构&#xff0c;一般常用在while&#xff0c;do…while&#xff0c;for循环三个语法&#xff0c;但我们一般来常用的是for循环&#xff0c;while与do…while我们只需要掌握就可以。 于此同时&#xff0c;我们需要掌握一下循环控制的关键字&#xff0c;开始循环时…

服务端⾼并发分布式结构演进之路

在进行技术学习过程中&#xff0c;由于大部分读者没有经历过一些中大型系统的实际经验&#xff0c;导致无法从全局理解一些概念&#xff0c;所以本文以一个"电子商务"应用为例&#xff0c;介绍从一百个到千万级并发情况下服务端的架构的演进过程&#xff0c;同时列举…

【绝对有用】什么是I/O密集型任务 什么是CPU密集型任务,异步IO 如何提高程序的效率?

I/O密集型任务和CPU密集型任务是计算机科学中两种不同类型的工作负载&#xff0c;它们的性能瓶颈在不同的资源上。理解这两者的区别和如何利用异步I/O提高程序效率对开发高效应用程序非常重要。 I/O密集型任务 I/O密集型任务是指那些主要受限于输入/输出操作&#xff08;例如…

SpringBoot:SpringBoot集成Druid监控慢SQL

一、前言 数据库连接池是一个至关重要的组成部分&#xff0c;一个优秀的数据库连接池可以显著提高应用程序的性能和可伸缩性。常见的连接池&#xff1a;Druid、HikariCP、C3P0、DBCP等等&#xff0c;不过目前大部分都是使用Druid或者SpringBoot默认的HikariCP&#xff01; 本文…

一个完整的Flutter应用

15.2 Flutter APP代码结构 | 《Flutter实战第二版》 我们先来创建一个全新的Flutter工程&#xff0c;命名为"github_client_app" 我们在项目根目录下分别创建imgs和fonts、jsons、l10n文件夹 工程目录如下&#xff1a; 在lib下创建文件夹如下&#xff1a; 在“jso…

服务器上设置pnpm环境变量

首先&#xff0c;确认 pnpm 是否已经安装&#xff1a; ls /www/server/nodejs/v20.10.0/bin/pnpm如果输出包含 pnpm&#xff0c;那么说明 pnpm 已经安装。 如果没有看到 pnpm&#xff0c;你可能需要重新安装它&#xff1a; npm install -g pnpm接下来&#xff0c;确保 PATH …

Word和Excel如何快速对齐姓名

日常工作经常遇到整理参会人员名单时&#xff0c;有2字姓名、3字姓名&#xff0c;为保证文档美观&#xff0c;你是否还在一个一个空格在敲空格&#xff1f; 今天刘小生分享如何在Word和Excel中快速对齐姓名&#xff0c;快来练起来吧&#xff01; 1. Word姓名对齐 【第一步】…

自动化平台总结(httprunner+djangorestframework+python3+Mysql+Vue)【基础结构构思】

一、前言 把一个以前自己搭建的自动化测试平台进行了一下重构升级&#xff0c;记录一下过程中的一些问题和总结。 二、简介 搭建的平台语言使用的是Python3.6&#xff0c;未来有空可能考虑加个java版本。前端用的Vue&#xff0c;主体是httprunner2.XDjangorest-framework&am…

Elasticsearch:智能 RAG,获取周围分块(二)

在之前的文章 “Elasticsearch&#xff1a;智能 RAG&#xff0c;获取周围分块&#xff08;一&#xff09; ” 里&#xff0c;它介绍了如何实现智能 RAG&#xff0c;获取周围分块。在那个文章里有一个 notebook。为了方便在本地部署的开发者能够顺利的运行那里的 notebook。在本…

小抄 20240616

1 都说要知行合一&#xff0c;只是口头说说的认知&#xff0c;不叫知&#xff0c;那是别人的认知&#xff0c;只是盲目乱窜的行动&#xff0c;也不叫行&#xff0c;那是别人的路径。 严格来说&#xff0c;每个人都在按照自己的所知去行动&#xff0c;每个人都是知行合一的&…

git 上拉下来的新项目web文件夹没有被idea管理,导致启动不了

让idea识别web项目&#xff0c;操作步骤&#xff1a; 1. 打开idea -- 文件 -- 项目结构&#xff1b; 2. 选择 模块 --- 添加 --- web -- 应用 --- 确定&#xff0c;就好了。 3. 文件夹中间出现个圆圈就是被识别到了。