news 2026/4/16 10:20:48

力扣hot图论部分

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣hot图论部分

目录

题目链接

岛屿数量思路及其代码

代码如下

腐烂的橘子思路及其代码

注意事项

代码

课程表的思路及其代码

注意事项

代码

前缀树的思路及其代码

思路

代码


题目链接

200. 岛屿数量 - 力扣(LeetCode)

994. 腐烂的橘子 - 力扣(LeetCode)

207. 课程表 - 力扣(LeetCode)

208. 实现 Trie (前缀树) - 力扣(LeetCode)

其中简单分个类 岛屿数量是FloodFill(洪水灌溉算法)专题

腐烂的橘子是多源BFS专题

课程表是拓扑排序专题

前缀树是一种数据结构

岛屿数量思路及其代码

其实思路都是大同小异的。不过我提一提我的细节处理部分。

排除已经遍历过的岛屿的方法

引入向量数组去处理4个方向

代码如下

class Solution { int[] dx={0,0,1,-1}; int[] dy={1,-1,0,0}; int size=0; boolean[][] visit; public int numIslands(char[][] grid) { Queue<int[]> queue=new LinkedList<>(); int m=grid.length; int n=grid[0].length; visit=new boolean[m][n]; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(grid[i][j]=='1'&&visit[i][j]==false){ queue.offer(new int[]{i,j}); // grid[i][j]='0'; visit[i][j]=true; while(!queue.isEmpty()){ int[] t=queue.poll(); int a=t[0]; int b=t[1]; for(int h=0;h<4;h++){ int x=a+dx[h]; int y=b+dy[h]; // if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]=='1'){ if(x>=0&&x<m&&y>=0&&y<n&&visit[x][y]==false&&grid[x][y]=='1'){ queue.offer(new int[]{x,y}); //将已经遍历过的修改为0 // grid[x][y]='0'; visit[x][y]=true; } } } size++; } } } return size; } }

腐烂的橘子思路及其代码

思路还是同岛屿数量,代码都长得差不多.

注意事项

怎么判断是否还有新鲜橘子呢

注意一个烂橘子同时腐烂周围的橘子算1次,如果有两个烂橘子分别同时腐烂周围的橘子也算一次

所以说引入queue.size()和is_Infected就很重要。

代码

class Solution { int fresh=0; boolean[][] visit; int[] dx={0,0,1,-1}; int[] dy={1,-1,0,0}; boolean isInfected=false; int minute=0; public int orangesRotting(int[][] grid) { int m=grid.length; int n=grid[0].length; visit=new boolean[m][n]; //先统计所有新鲜的橘子数 for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(grid[i][j]==1){ fresh++; } // fresh++; } } if(fresh==0){ return 0; } Queue<int[]> queue=new LinkedList<>(); //先找到所有腐烂的橘子,然后加入queue种 for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(grid[i][j]==2){ queue.offer(new int[]{i,j}); visit[i][j]=true; } } } while(!queue.isEmpty()){ //因为可能一次有多个腐烂橘子加入队列 同时是腐烂周围的橘子,本质上都是算一分钟 int size=queue.size(); for(int i=0;i<size;i++){ int[] t=queue.poll(); int a=t[0]; int b=t[1]; for(int h=0;h<4;h++){ int x=a+dx[h]; int y=b+dy[h]; if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&visit[x][y]==false){ queue.offer(new int[]{x,y}); visit[x][y]=true; fresh--; isInfected=true; } } } if(isInfected){ minute++; //记得还原 isInfected=false; } } return fresh>0?-1:minute; } }

课程表的思路及其代码

首先解决这道题,你需要直到什么是拓扑排序。

本质就是判断图是否有环即可

注意事项

怎么去建图,我认为很关键

代码

class Solution { public boolean canFinish(int numCourses, int[][] prerequisites) { int m=prerequisites.length; // int n=prerequisites[0].length; //统计入度 int[] in=new int[numCourses]; //建图 Map<Integer,List<Integer>> map=new HashMap<>(); for(int i=0;i<m;i++){ int a=prerequisites[i][0]; int b=prerequisites[i][1]; //关系是b->a if(!map.containsKey(b)){ map.put(b,new ArrayList<>()); } map.get(b).add(a); in[a]++; } //进行拓扑排序 //进行BFS(找到所有入度为0的放入队列) Queue<Integer> queue=new LinkedList<>(); for(int i=0;i<numCourses;i++){ if(in[i]==0){ queue.offer(i); } } while(!queue.isEmpty()){ int t=queue.poll(); //删除与入度为0的点相连的边 for(int x:map.getOrDefault(t,new ArrayList<>())){ in[x]--; if(in[x]==0){ queue.offer(x); } } } for(int p:in){ if(p!=0){ return false; } } return true; } }

前缀树的思路及其代码

这道题我第一次写的时候,有点浮躁,看题解没看懂。今天在一次写的时候,突然看懂了.

主要是看的灵神的题解

思路

insert的具体插入图(插入apple)

代码

class Trie { public static class Node{ Node[] son=new Node[26]; boolean end=false; } public Node root=new Node(); public void insert(String word) { Node cur=root; for(char c:word.toCharArray()){ int m=c-'a'; if(cur.son[m]==null){ cur.son[m]=new Node(); } cur=cur.son[m]; } cur.end=true; } public boolean search(String word) { return find(word)==2; } public boolean startsWith(String prefix) { return find(prefix)!=0; } public int find(String word){ Node cur=root; for(char c:word.toCharArray()){ int m=c-'a'; if(cur.son[m]==null){ return 0; } cur=cur.son[m]; } //返回2为完全匹配 返回1为前缀匹配 return cur.end?2:1; } } /** * 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); */
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/5 3:57:11

Apache SeaTunnel Web:企业级数据集成平台的实战部署与应用

Apache SeaTunnel Web&#xff1a;企业级数据集成平台的实战部署与应用 【免费下载链接】seatunnel-web SeaTunnel is a distributed, high-performance data integration platform for the synchronization and transformation of massive data (offline & real-time). …

作者头像 李华
网站建设 2026/4/10 8:10:47

为什么99%的智能体系统失败?缺失这4项接口标准是主因,

第一章&#xff1a;为什么99%的智能体系统失败&#xff1f;缺失这4项接口标准是主因在构建现代智能体系统时&#xff0c;开发者往往聚焦于算法优化与模型训练&#xff0c;却忽视了系统间协同的关键——标准化接口。据行业调研数据显示&#xff0c;超过90%的智能体项目在集成阶段…

作者头像 李华
网站建设 2026/4/16 10:13:07

揭秘MCP续证材料审核潜规则:90%的人都忽略的3个关键细节

第一章&#xff1a;MCP续证材料提交的核心流程概述续证是MCP&#xff08;Microsoft Certified Professional&#xff09;认证维持有效性的关键环节&#xff0c;涉及材料准备、系统提交与审核反馈等多个阶段。为确保顺利通过续证审核&#xff0c;申请人需遵循标准化流程完成各项…

作者头像 李华
网站建设 2026/4/15 7:43:10

还在为设备不兼容头疼?一文掌握智能家居Agent适配核心逻辑

第一章&#xff1a;智能家居Agent设备兼容的挑战与现状随着物联网技术的迅猛发展&#xff0c;智能家居生态系统日益庞大&#xff0c;各类智能设备如灯光、温控器、安防摄像头等不断涌入家庭场景。然而&#xff0c;尽管设备数量激增&#xff0c;不同厂商之间缺乏统一标准&#x…

作者头像 李华
网站建设 2026/4/14 3:42:37

SysTick 延时与 DWT 延时

在 Cortex-M 系列 MCU 中&#xff0c;常见的内核级延时方式主要有 SysTick 定时 和 DWT&#xff08;CYCCNT&#xff09;定时。两者虽然都能实现延时&#xff0c;但定位和适用场景完全不同。一、基本概念SysTickCortex-M 内核自带的 24 位定时器&#xff0c;主要用于系统节拍&am…

作者头像 李华
网站建设 2026/4/13 22:36:21

6、产品规划与需求管理:从案例到实践

产品规划与需求管理:从案例到实践 在软件开发和产品管理领域,有许多关键问题需要我们深入探讨,以确保项目的成功。下面我们将从一些有趣的案例出发,深入剖析软件项目中常见的问题以及有效的解决方法。 常见问题剖析 在日常软件团队工作中,常常会出现一些类似“你没告诉…

作者头像 李华