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

051岛屿数量

岛屿数量题目链接https://leetcode.cn/problems/number-of-islands/description/?envTypestudy-plan-v2envIdtop-100-liked我的解答public int numIslands(char[][] grid) { int m grid.length, n grid[0].length; int[][] directions new int[][]{{-1,0}, {1,0},{0,-1},{0,1}};//上下左右四个方向 boolean[][] visited new boolean[m][n]; DequeInteger rows new LinkedList(); DequeInteger cols new LinkedList(); int ans 0; for(int i 0; i m; i){ for(int j 0; j n; j){ if(visited[i][j] || grid[i][j] 0){ continue; } //遇到没有被访问过的‘1’了 ans; rows.push(i); cols.push(j); while(!rows.isEmpty()){ int row rows.pop(); int col cols.pop(); for(int k 0; k 4; k){ row directions[k][0]; col directions[k][1]; if(row 0 row m col 0 col n grid[row][col] 1 visited[row][col] false){ visited[row][col] true; rows.push(row); cols.push(col); } row - directions[k][0]; col - directions[k][1]; } } } } return ans; }分析代码的时间复杂度为O(mn)空间复杂度为O(mn)。解题思路用visited数组记录当前位置是否被访问过遍历grid。当遇到没有被访问过的‘1’时让答案加一并让此位置的横坐标和纵坐标入栈然后从这个位置开始往上、下、左、右四个方向拓展未访问过的‘1’若存在未访问过的‘1’则让此位置的横坐标和纵坐标入栈重复此操作直到栈为空即可。看了官方题解后的解答//方法一深度优先搜索 //时间复杂度O(mn) //空间复杂度O(mn) public int numIslands(char[][] grid) { int m grid.length, n grid[0].length; int ans 0; for(int i0; im; i){ for(int j0; jn; j){ if(grid[i][j] 1){ ans; dfs(grid, i, j); } } } return ans; } public void dfs(char[][] grid, int x, int y){ int m grid.length, n grid[0].length; //越界或当前位置为‘0’ if(x0 || xm || y0 || yn || grid[x][y] 0){ return; } grid[x][y] 0; //上下左右四个方向分别进行深度优先搜索 dfs(grid, x-1, y); dfs(grid, x1, y); dfs(grid, x, y-1); dfs(grid, x, y1); } //方法二广度优先搜索 //时间复杂度O(mn) //空间复杂度O(min(m,n)) public int numIslands(char[][] grid) { int m grid.length, n grid[0].length; int[][] directions new int[][]{{-1,0}, {1,0}, {0,-1}, {0,1}}; QueueInteger neighbors new LinkedList(); int ans 0; for(int i0; im; i){ for(int j0; jn; j){ if(grid[i][j] 1){ ans; grid[i][j] 0; neighbors.add(i * n j); while(!neighbors.isEmpty()){ int index neighbors.remove(); int row index / n; int col index % n; for(int k0; k4; k){ row directions[k][0]; col directions[k][1]; if(row0 rowm col0 coln grid[row][col] 1){ grid[row][col] 0; neighbors.add(row * n col); } row - directions[k][0]; col - directions[k][1]; } } } } } return ans; } //方法三并查集 //时间复杂度O(MN×α(MN)) //空间复杂度O(MN) class UnionFind { int count;//集合总数 int[] parent;//代表节点的下标代表节点的parent是它自己 int[] size;//集合的元素个数 int[] stack;//调用find方法时对并查集做扁平化优化 public UnionFind(char[][] grid){ count 0; int m grid.length, n grid[0].length; parent new int[m * n]; size new int[m * n]; stack new int[m * n]; for(int i0; im; i){ for(int j0; jn; j){ if(grid[i][j] 1){ parent[i * n j] i * n j; size[i * n j] 1; count; } } } } public int find(int i){ int cnt 0; while(i ! parent[i]){ stack[cnt] i; i parent[i]; } //对当前集合做扁平化优化 while(cnt0){ parent[stack[--cnt]] i; } return i; } public void union(int i, int j){ int fi find(i); int fj find(j); if(fi ! fj){ //小挂大提高并查集的效率 if(size[fi] size[fj]){ parent[fj] fi; size[fi] size[fj]; } else{ parent[fi] fj; size[fj] size[fi]; } count--; } } public int getCount(){ return count; } } public int numIslands(char[][] grid) { int m grid.length, n grid[0].length; UnionFind uf new UnionFind(grid); int[][] directions new int[][]{{-1,0}, {1,0}, {0,-1}, {0,1}}; for(int i0; im; i){ for(int j0; jn; j){ if(grid[i][j] 1){ grid[i][j] 0; for(int k0; k4; k){ int ii i directions[k][0]; int jj j directions[k][1]; if(ii0 iim jj0 jjn grid[ii][jj] 1){ uf.union(i * n j, ii * n jj); } } } } } return uf.getCount(); }分析​ 1、方法一的解题思路遍历grid当遇到’1’时开始深度优先搜索深搜过程中遇到的’1’将其全部变为’0’最终进行了几次深搜就是有几个岛屿。​ 2、方法二的解题思路只是将方法一的深度优先搜索改为了广度优先搜索。遍历grid当遇到’1’时开始广度优先搜索用队列维护相邻’1’的下标广搜过程中遇到的’1’将其全部变为’0’最终进行了几次广搜就是有几个岛屿。​ 3、方法三的解题思路采用并查集。遍历grid当遇到’1’时将其置为’0’并开始向上下左右四个方向检查是否可以合并最终并查集中的集合总数就是岛屿的数量。​ 并查集并查集的关键成员变量有两个parent用来记录当前集合的代表节点代表节点的parent是它自己size用来记录当前集合的元素个数。本题并查集的关键方法有两个find方法用于查找当前元素所属集合的代表节点同时对当前集合做扁平化优化union方法用于合并两个元素所属的集合注意判断这两个元素所属的是否为同一个集合利用栈可以对并查集进行扁平化优化来提高并查集的效率。并查集效率的关键小挂大、扁平化。​ 并查集的详细知识点及其应用请参考视频链接https://www.bilibili.com/video/BV1894y1W7Sb/?spm_id_from333.1387.collection.video_card.clickvd_source8d4b451fa239e70767b6b38211a13a06总结本题有三种解决方法分别为深度优先搜索、广度优先搜索、并查集。三种方法都采用了过河拆桥即当前位置遍历完后就将当前位置的’1’置为’0’避免给后续过程带来干扰。

相关文章:

051岛屿数量

岛屿数量 题目链接:https://leetcode.cn/problems/number-of-islands/description/?envTypestudy-plan-v2&envIdtop-100-liked 我的解答: public int numIslands(char[][] grid) {int m grid.length, n grid[0].length;int[][] directions new i…...

Netscape 浏览器:互联网时代的先驱者

Netscape 浏览器:互联网时代的先驱者 引言 自互联网诞生以来,浏览器作为连接用户与网络世界的重要工具,见证了互联网的飞速发展。在众多浏览器中,Netscape 浏览器以其创新和引领潮流的特性,成为了互联网时代的先驱者。本文将回顾 Netscape 浏览器的发展历程、技术特点及…...

全栈AI应用开发框架Flappy:从智能体到生产级Web应用的快速构建指南

1. 项目概述:从“Flappy”到“Pleisto”的AI应用构建新范式最近在AI应用开发圈子里,一个名为“pleisto/flappy”的项目开始引起不少人的注意。乍一看这个名字,你可能会联想到那个经典的像素小鸟游戏,但此“Flappy”非彼“Flappy”…...

NotebookLM脑机接口安全红线清单,3类合规风险已致2家医疗AI公司终止临床试验

更多请点击: https://intelliparadigm.com 第一章:NotebookLM脑机接口研究 NotebookLM 是 Google 推出的基于用户自有文档进行深度理解与推理的 AI 助手,其核心能力在于语义锚定(semantic grounding)与多源文档交叉推…...

深入解析Enso:构建高性能可编程代理与API网关的Go框架

1. 项目概述:一个被低估的“瑞士军刀”如果你在开源社区里混迹过一段时间,大概率见过这样的场景:一个项目仓库,名字起得挺酷,比如“Enso”,简介里写着“一个现代化的代理工具”,但点进去一看&am…...

别再为‘No module named matlab.engine’抓狂了!手把手教你MATLAB与Python版本匹配与绑定(附Anaconda虚拟环境指南)

彻底解决MATLAB与Python版本冲突:从原理到实战的完整指南 当你兴奋地想在Python中调用MATLAB强大的信号处理功能时,突然跳出的"No module named matlab.engine"错误提示就像一盆冷水浇下来。这不是简单的安装问题,而是两个生态系统…...

Cursor AI插件开发:从代码补全到智能动作执行的范式演进

1. 项目概述:当AI代码助手遇上插件生态最近在GitHub上看到一个挺有意思的项目,叫RightbrainAI/cursor-plugin。光看名字,可能很多用惯了Cursor的朋友会眼前一亮,以为这是Cursor编辑器官方或者某个社区大神出的插件。但点进去仔细一…...

制造业生产能耗智能管控,落地步骤与落地成本优化方案:基于AI Agent与TARS大模型的全链路实战指引

在2026年的工业数字化浪潮中,制造业正面临前所未有的能源双控压力。随着工信部办公厅发布《关于组织开展2026年度工业节能监察工作的通知》,针对新能源产业链及重点耗能环节的监管已进入“精细化、实时化、透明化”的新阶段。对于企业而言,能…...

成本数据多系统自动采集与分析实操指南:基于2026大模型Agent的超自动化实践

在2026年的数字化转型深水区,企业对于“成本”的理解已从静态的财务报表演进为实时的流式数据。然而,即便是在大模型技术全面爆发的今天,数据孤岛依然是阻碍成本精细化管理的首要顽疾。成本数据往往碎片化分布在ERP、MES、WMS、供应链平台及各…...

终极指南:在Windows上使用APK Installer轻松安装Android应用

终极指南:在Windows上使用APK Installer轻松安装Android应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行Android应用吗&…...

5分钟掌握BilibiliDown音频提取:从B站视频轻松获取无损音乐

5分钟掌握BilibiliDown音频提取:从B站视频轻松获取无损音乐 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirr…...

解决Claude Code频繁封号问题转向Taotoken稳定服务的配置指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 解决Claude Code频繁封号问题转向Taotoken稳定服务的配置指南 如果你在使用 Claude Code 时遇到了账号不稳定或 Token 额度受限的问…...

HOSFEM中矩阵向量乘法优化与几何因子重计算技术

1. 矩阵向量乘法在HOSFEM中的核心地位与挑战 高阶/谱有限元方法(HOSFEM)是求解偏微分方程(PDE)的重要工具,广泛应用于计算流体力学、结构力学和电磁学等领域。与传统低阶方法相比,HOSFEM能以更少的自由度达…...

OmenSuperHub:惠普OMEN游戏本性能优化终极指南 - 完全免费开源解决方案

OmenSuperHub:惠普OMEN游戏本性能优化终极指南 - 完全免费开源解决方案 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为惠普OMEN游戏本官…...

会话包装器设计:提升API连接弹性与可观测性的工程实践

1. 项目概述:一个被低估的会话管理利器如果你经常和API打交道,尤其是那些需要维护会话状态的服务,肯定遇到过这样的烦恼:每次请求都要手动处理token、处理重连逻辑、管理超时和重试,代码里到处都是重复的胶水代码。更头…...

深度学习嵌入操作优化与DAE架构实践

1. 嵌入操作与DAE架构的核心挑战在深度学习推荐系统和图神经网络中,嵌入操作(Embedding Operations)占据了超过60%的计算时间。这类操作本质上是一种特殊的稀疏-密集张量乘法(SpMM),其计算模式具有两个显著…...

嵌入式Linux信号量实战:多线程互斥点灯程序设计与实现

1. 项目概述与核心思路最近在整理嵌入式Linux开发笔记时,翻到了一个挺有意思的小项目:用Linux信号量来实现一个互斥的点灯程序。听起来可能有点“杀鸡用牛刀”的感觉,毕竟点个灯用个全局变量或者简单的标志位也能搞定。但这个小项目背后的价值…...

Next.js全栈开发最佳实践:从零搭建现代化Web应用

1. 项目概述:一个现代Web开发的“瑞士军刀”如果你和我一样,在过去几年里频繁地使用Next.js、TypeScript和Tailwind CSS来构建前端应用,那么你肯定也经历过无数次重复的“项目初始化”工作。从安装依赖、配置TypeScript和ESLint,到…...

TypeScript + Next.js + Tailwind CSS 现代Web开发最佳实践模板解析

1. 项目概述:一个现代Web开发的“瑞士军刀”如果你最近在考虑启动一个Next.js项目,并且希望它从一开始就具备现代化的技术栈、清晰的代码结构和高效的开发体验,那么你很可能已经听说过或者正在寻找一个合适的“启动器”。theodorusclarence/t…...

Web NFC技术入门:在浏览器中实现NFC标签读写与信息管理

1. 项目概述:当NFC遇见浏览器作为一名在嵌入式系统和物联网领域摸爬滚打了十多年的开发者,我经历过无数次需要将物理设备与数字世界连接起来的项目。从早期的红外、蓝牙,到后来的RFID,每次技术迭代都试图让这种连接变得更无缝、更…...

NIPAP:开源IP地址管理平台如何实现企业级网络规划效率提升300%

NIPAP:开源IP地址管理平台如何实现企业级网络规划效率提升300% 【免费下载链接】NIPAP Neat IP Address Planner - NIPAP is the best open source IPAM in the known universe, challenging classical IP address management (IPAM) systems in many areas. 项目…...

量子错误校正与机器学习中的辅助比特影响研究

1. 量子错误校正与量子机器学习的基础概念量子计算的核心挑战之一是量子态的脆弱性。与环境相互作用导致的退相干效应会迅速破坏量子信息,这使得量子错误校正(QEC)成为实现实用量子计算的关键技术。在传统量子计算中,QEC通过冗余编…...

3个简单步骤彻底解决GitHub下载龟速问题:Fast-GitHub插件完全指南

3个简单步骤彻底解决GitHub下载龟速问题:Fast-GitHub插件完全指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 你是…...

py每日spider案例之某guangdong省人mingzhengfu登录接口(难度高 )

加密入口: 逆向接口: sm2密钥接口: js逆向代码: const fs = require("fs"); const path = re...

SoC芯片设计全流程解析:从架构定义到流片制造

1. 项目概述:从“黑盒子”到“城市蓝图”当我们谈论智能手机、智能手表、路由器乃至汽车里的智能座舱时,我们谈论的核心,往往是一个被称为“片上系统”或SoC的硅片。对于很多刚入行的朋友,甚至是一些有经验的软件工程师来说&#…...

基于RAG的智能文档问答系统:从原理到实践

1. 项目概述与核心价值如果你是一名开发者,或者经常需要处理各种技术文档、API参考、项目说明,那么你一定对“信息孤岛”深有体会。代码在一个仓库里,设计文档在另一个云盘,会议记录在Notion,而临时的讨论和决策可能散…...

暗黑破坏神2存档修改器终极指南:5分钟掌握Diablo Edit2完整教程

暗黑破坏神2存档修改器终极指南:5分钟掌握Diablo Edit2完整教程 【免费下载链接】diablo_edit Diablo II Character editor. 项目地址: https://gitcode.com/gh_mirrors/di/diablo_edit 你是否曾经在暗黑破坏神2中花费数小时刷装备却一无所获?是否…...

3大核心功能深度解析:茉莉花插件如何彻底解决中文文献管理难题

3大核心功能深度解析:茉莉花插件如何彻底解决中文文献管理难题 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 您是否…...

基于小波变换与渐进式特征金字塔网络的高效目标检测方法 —— 以电网巡检为例

点击蓝字关注我们关注并星标从此不迷路计算机视觉研究院公众号ID|计算机视觉研究院学习群|扫码在主页获取加入方式https://pmc.ncbi.nlm.nih.gov/articles/PMC12923819/pdf/41598_2026_Article_37017.pdf计算机视觉研究院专栏Column of Computer Vision …...

汇顶科技入围GSA奖项:中国芯片设计公司的战略聚焦与成长路径分析

1. 项目概述:一次里程碑式的行业认可最近在半导体圈子里,一个消息引起了不小的波澜:汇顶科技成功入围了全球半导体联盟(GSA)2019年度的两大奖项提名。对于不熟悉这个领域的朋友来说,这或许只是一个普通的公…...