当前位置: 首页 > news >正文

深(广)度优先遍历

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);*/

相关文章:

  • STM32单片机-FLASH闪存
  • LC15.三数之和、LC22括号生成
  • OpenCV--滤波器(一)
  • Redis缓存的一些概念性问题
  • Milvus跨集群数据迁移
  • MySQL 保姆级教程(八):创建计算字段
  • 【Ubuntu通用压力测试】Ubuntu16.04 CPU压力测试
  • 传统后端SQL数据层替代解决方案: 内置数据源+JdbcTemplate+H2数据库 详解
  • YOLOv10改进 | Conv篇 |YOLOv10引入SPD-Conv卷积
  • 【前端技巧】css篇
  • React.ReactElement 与 React.ReactNode
  • Effective C++ 改善程序与设计的55个具体做法笔记与心得 3
  • SonarQube集成Jenkins平台搭建
  • 【Python】一文向您详细解析内置装饰器 @lru_cache
  • 【Android面试八股文】Kotlin内置标准函数let的原理是什么?
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • emacs初体验
  • Github访问慢解决办法
  • Laravel5.4 Queues队列学习
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • vue-loader 源码解析系列之 selector
  • 电商搜索引擎的架构设计和性能优化
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 手写双向链表LinkedList的几个常用功能
  • 微信小程序填坑清单
  • 06-01 点餐小程序前台界面搭建
  • ​TypeScript都不会用,也敢说会前端?
  • ## 1.3.Git命令
  • #1015 : KMP算法
  • #if和#ifdef区别
  • (7)摄像机和云台
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (含答案)C++笔试题你可以答对多少?
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (七)Flink Watermark
  • (三)c52学习之旅-点亮LED灯
  • (算法)Travel Information Center
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • (最新)华为 2024 届秋招-硬件技术工程师-单板硬件开发—机试题—(共12套)(每套四十题)
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET 反射 Reflect
  • .NET 药厂业务系统 CPU爆高分析
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET实现之(自动更新)
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @Autowired标签与 @Resource标签 的区别
  • @Autowired多个相同类型bean装配问题
  • @SpringBootApplication 包含的三个注解及其含义
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [Android Studio 权威教程]断点调试和高级调试