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

hot100-47岛屿数量

一、题目

由 1 和 0组成的二维网格,计算网格中岛屿的数量。

岛屿总是被水包围,并且每个岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

二、思路

1、深度优先搜索DFS:遍历网格,如果当前格子是'1',说明找到了一个新的岛屿。计数+1,并调用 dfs递归把上下左右淹没整个岛屿(把相连的 '1' 改为 '0')

2、广度优先遍历BFS:定义一个二维布尔数组 visited 和队列queue。遇到未访问的 '1' 启动搜索,一层层向外扩展,将整个岛屿的所有格子标记为已访问。(在BFS中处理队列中的坐标的四周坐标,标记已访问)

三、代码

1)深度优先搜索 DFS

class Solution { public int numIslands(char[][] grid) { int count = 0; int m = grid.length, n = grid[0].length; for(int i = 0;i<m;i++){ for(int j = 0; j<n;j++){ if(grid[i][j] == '1'){ count++; dfs(grid,i,j); } } } return count; } public void dfs(char[][] grid,int i,int j){ int m = grid.length, n=grid[0].length; if(i <0 || i>=m || j<0 || j>=n || grid[i][j] == '0') return ; grid[i][j] = '0'; dfs(grid,i-1,j); dfs(grid,i+1,j); dfs(grid,i,j-1); dfs(grid,i,j+1); } }

2)广度优先搜索 BFS

class Solution { int res = 0; int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}}; boolean[][] visited; public int numIslands(char[][] grid) { int m = grid.length,n = grid[0].length; visited = new boolean[m][n]; for(int i = 0;i<m;i++){ for(int j = 0;j<n;j++){ if(grid[i][j] == '1' && !visited[i][j]){ bfs(grid,i,j); res++; } } } return res; } LinkedList<int[]> queue = new LinkedList<>(); public void bfs(char[][] grid,int i,int j){ int m = grid.length, n = grid[0].length; queue.offer(new int[] {i,j}); while(!queue.isEmpty()){ int size = queue.size(); for(int num = 0; num < size; num++){ int[] node = queue.poll(); for(int d = 0;d<4;d++){ int nodeX = node[0]+dir[d][0]; int nodeY = node[1]+dir[d][1]; if(nodeX<0 || nodeX>=m || nodeY<0 || nodeY>=n) continue; if(grid[nodeX][nodeY] == '1' && !visited[nodeX][nodeY]){ queue.offer(new int[] {nodeX,nodeY}); visited[nodeX][nodeY] = true; } } } } } }

四、总结

都在主函数中遍历网格,每遇到一个未处理的陆地('1')就计数加一,并通过搜索(DFS 或 BFS)将该陆地所属的整个岛屿全部标记为“已处理”,避免重复计数。差异在于:DFS 直接将原数组中的 '1' 改为 '0' 来标记访问,不使用额外空间;而 BFS 保留原数组不变,借助一个visited数组来记录是否访问过,仅对未访问的 '1' 进行处理。

http://www.cnnetsun.cn/news/2582.html

相关文章:

  • 前端构建工具详解:Vite 与 Webpack 深度对比与实战指南
  • 智能文本 AI 客服:藏在对话框里的技术魔法
  • SPEC 为什么会失败?
  • 【实用工具类】基于 Guava Cache 实现通用 Token 缓存工具类(附完整源码)
  • 土木堡之变的血色警示:别让“亲信滤镜“毁掉你的人生决策
  • IAR云就绪平台实现对瑞萨RH850/U2x的全系列支持,赋能新一代汽车电子开发
  • 软考重磅消息!刚刚明确!恭喜2026年考生!
  • 排它锁与共享锁详解
  • 2026 年迪拜海湾食品展
  • 论文分享|告别“重复造轮子”:一种持续进化的大规模多任务机器学习方法论
  • Wan2.2-T2V-5B深度解析:轻量化架构下的高质量视频生成方案
  • Wan2.2-T2V-5B在健身房课程介绍视频中的动态动作生成表现
  • Ceph 对象网关性能深入探讨:构建安全且可扩展的对象存储(上)
  • 思考与练习之答案与解析(大学计算机基础系列:人工智能导论)
  • Python 装饰器:@abstractmethod
  • Python中字典
  • 新发传染病防控中的技术创新与公平性挑战:从监测预警到应急响应的综合视角
  • 计算机视觉技术驱动下的智能油藏建模与数据同化方法体系研究
  • 当“落日楼台一笛风“遇见AI算法
  • 如何使用pytorch模拟Pearson loss训练模型
  • flowmix/flow 可视化工作流编辑器, 开源!
  • 2025 年程序员薪资水平排行前十的城市
  • 2026年六大未来产业发展趋势与人工智能八大落地场景洞察(附下载)
  • 【人工智能+】人工智能+交通领域应用方案(附下载)
  • ChatGPT共享链接钓鱼攻击新套路:伪装实用指南诱导手动植马
  • AI重构竞争格局:企业级应用的爆发与价值分化
  • Redis 分布式锁的 5个坑,真是又大又深!
  • Go Flight Recorder 终于来了,线上问题可以 “回放“ 了!
  • 【docker】——不启用docker的启动命令,使用自己的
  • py每日spider案例之7点影视链接获取