news 2026/6/13 14:37:32

力扣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/6/13 21:26:58

探索BilibiliDown音频下载新境界:从入门到精通的完整指南

探索BilibiliDown音频下载新境界&#xff1a;从入门到精通的完整指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirror…

作者头像 李华
网站建设 2026/6/13 22:17:51

生物信息AI Agent应用全解析(数据分析能力大揭秘)

第一章&#xff1a;生物信息AI Agent的数据分析概述在现代生物信息学研究中&#xff0c;AI Agent 正逐渐成为处理高通量数据、基因组序列分析和蛋白质结构预测的核心工具。这些智能系统能够自动化执行数据预处理、特征提取、模型训练与结果解释等任务&#xff0c;显著提升科研效…

作者头像 李华
网站建设 2026/6/10 12:12:10

MCP量子认证变革真相曝光(前所未有的认证升级)

第一章&#xff1a;MCP量子认证的更新内容MCP量子认证体系在最新版本中引入了多项关键性升级&#xff0c;旨在提升认证过程的安全性、效率与可扩展性。此次更新聚焦于身份验证协议、密钥管理机制以及跨平台兼容性&#xff0c;全面支持现代分布式系统的部署需求。增强的身份验证…

作者头像 李华
网站建设 2026/6/13 18:52:01

Step-GUI 技术报告学习

1、介绍如何高效地获取高质量的 轨迹与知识数据&#xff0c;以提升智能体在目标领域内的性能&#xff1f;传统的标注方法存在主观性强和成本高昂的问题&#xff0c;限制了GUI智能体开发的可扩展性。 为应对这一挑战&#xff0c;我们引入了以校准步骤奖励系统&#xff08;CSRS&a…

作者头像 李华
网站建设 2026/6/11 13:08:15

从评估到执行,医疗康复 Agent 全流程解析,重塑个性化运动指导

第一章&#xff1a;医疗康复 Agent 的运动指导在现代智能医疗系统中&#xff0c;医疗康复 Agent 正逐渐成为患者术后恢复与慢性病管理的重要辅助工具。这类 Agent 能够基于患者的生理数据、康复阶段和医生建议&#xff0c;提供个性化的运动指导方案&#xff0c;确保动作规范、强…

作者头像 李华
网站建设 2026/6/13 5:37:28

Smart Socket:企业级高性能通信框架架构选型指南

Smart Socket&#xff1a;企业级高性能通信框架架构选型指南 【免费下载链接】smart-socket A High Performance Java AIO framework 项目地址: https://gitcode.com/gh_mirrors/smar/smart-socket 通信性能瓶颈&#xff1a;企业数字化转型的技术挑战 在当今微服务架构…

作者头像 李华