news 2026/1/17 3:46:16

力扣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/1/16 5:40:31

AI Agent日志分析核心技术揭秘(仅限资深工程师查看)

第一章&#xff1a;AI Agent日志分析的核心挑战在构建和运维AI Agent系统时&#xff0c;日志分析是保障其稳定性与可解释性的关键环节。然而&#xff0c;由于AI Agent具备自主决策、多轮交互和动态环境感知等特性&#xff0c;其日志数据呈现出高度非结构化、异构性和高通量的特…

作者头像 李华
网站建设 2025/12/21 5:49:15

Notepad--:国产编辑器破局者,三大技术架构重构文本编辑体验

在文本编辑器这个看似饱和的赛道中&#xff0c;一款名为Notepad--的国产软件正以颠覆性技术架构重新定义跨平台编辑器的可能性。从解决中文编码困境到实现10GB级大文件秒开&#xff0c;这款编辑器用三年时间完成了从"能用"到"好用"的技术跃迁&#xff0c;成…

作者头像 李华
网站建设 2026/1/11 15:12:37

多目标路径冲突怎么办,物流Agent动态避障策略深度解读

第一章&#xff1a;物流运输 Agent 的路线调整在现代物流系统中&#xff0c;运输 Agent 需要根据实时交通、天气和订单变更动态调整行驶路线。这种智能化的路径重规划能力显著提升了配送效率与客户满意度。环境感知与数据输入 运输 Agent 依赖多源数据进行决策&#xff0c;主要…

作者头像 李华
网站建设 2026/1/3 5:46:07

跨领域Agent接口标准化实践(90%团队忽略的兼容性陷阱)

第一章&#xff1a;跨领域 Agent 的接口标准在构建分布式智能系统时&#xff0c;跨领域 Agent 之间的互操作性成为核心挑战。为实现不同领域、架构与协议下的 Agent 能够高效协同&#xff0c;建立统一的接口标准至关重要。该标准不仅定义通信格式与行为契约&#xff0c;还规范了…

作者头像 李华