news 2026/6/3 12:15:23

力扣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/1 23:06:59

复杂农田环境下无人机Agent避障成功率提升90%的秘密

第一章&#xff1a;复杂农田环境下无人机Agent避障成功率提升90%的背景与挑战在现代农业智能化转型过程中&#xff0c;无人机Agent被广泛应用于作物监测、精准喷洒和地形测绘等任务。然而&#xff0c;复杂农田环境——如密集植被、不规则田埂、动态障碍物&#xff08;如牲畜或农…

作者头像 李华
网站建设 2026/6/3 11:27:45

从零构建生物信息AI Agent,快速上手高通量测序数据分析全流程

第一章&#xff1a;生物信息AI Agent概述在生物信息学领域&#xff0c;AI Agent 正逐渐成为处理复杂数据分析任务的核心工具。这类智能体结合了人工智能算法与生物学知识&#xff0c;能够在基因组学、蛋白质结构预测、药物发现等场景中自主执行数据解析、模式识别与决策建议。核…

作者头像 李华
网站建设 2026/6/3 21:34:52

传统物流 vs 量子 Agent:成本对比惊人,企业降本增效的终极选择?

第一章&#xff1a;物流量子 Agent 的成本革命传统物流系统长期受限于路径规划效率低、资源调度滞后和运营成本高企等问题。随着量子计算与人工智能的深度融合&#xff0c;物流量子 Agent&#xff08;Logistics Quantum Agent, LQA&#xff09;应运而生&#xff0c;正在引发一场…

作者头像 李华
网站建设 2026/6/3 15:39:41

股票指数移动平均EMA和标准差变化Python代码

股票指数移动平均EMA和标准差变化计算 Python代码 在import pandas as pd import numpy as np import matplotlib.pyplot as plt # 设置中文显示 plt.rcParams["font.family"] ["SimHei", "Microsoft YaHei", "SimSun", "KaiTi&…

作者头像 李华
网站建设 2026/6/1 23:07:09

【云原生Agent治理核心策略】:揭秘高可用服务治理体系构建之路

第一章&#xff1a;云原生Agent治理的演进与核心挑战随着云原生技术的广泛应用&#xff0c;分布式系统中运行的Agent&#xff08;如Sidecar代理、监控采集器、服务网格数据平面等&#xff09;数量呈指数级增长。这些轻量级组件在提升系统可观测性、安全性和通信能力的同时&…

作者头像 李华
网站建设 2026/6/3 14:53:05

GemDesign:一键生成网页app原型设计稿

GemDesign 今天推荐一款非常适合产品经理&#xff0c;UI/UX 设计师使用的工具——GemDesign。 它是一款AI原生的高保真原型设计工具&#xff0c;能把你的想法、草图或需求迅速转变为可交互、高保真原型或专业设计界面。 支持文字描述、草图上传生成&#xff0c;提供灵活编辑…

作者头像 李华