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

力扣HOT100(34)图论-岛屿数量

方法一:深度优先搜索(DFS,面试首选)

1. 核心思路

我们把网格看作一个无向图

  • 每个'1'是一个顶点
  • 上下左右相邻的'1'之间有边相连

解题步骤:

  1. 遍历整个网格,遇到'1'说明发现了新岛屿,岛屿数 + 1
  2. 以这个'1'为起点,进行 DFS 遍历:
    • 把当前'1'改成'0'(标记为已访问,避免重复统计)
    • 递归遍历它的上下左右四个方向,遇到'1'就继续递归
  3. 一次 DFS 会把整个连通的岛屿全部标记为 0,后续遍历不会再遇到这些点
  4. 最终 DFS 的次数,就是岛屿的数量
class Solution { public: //写一个深度优先的函数 void dfs(vector<vector<char>>& grid,int r,int c){ //需要传入的参数是一个矩阵grid 开始的起点的行数和列数 int nr = grid.size();//行数 int nc = grid[0].size();//列数 grid[r][c] = '0';//首先上来把这个位置的点记成0,防止下次找到他 //上面的数如果是1:那就对这个1进行搜索 if(r-1 >=0&&grid[r-1][c] == '1') dfs(grid,r-1,c); //下面: if(r+1 < nr&&grid[r+1][c] == '1') dfs(grid, r + 1, c); if (c - 1 >= 0 && grid[r][c-1] == '1') dfs(grid, r, c - 1); if (c + 1 < nc && grid[r][c+1] == '1') dfs(grid, r, c + 1); } int numIslands(vector<vector<char>>& grid) { //核心思路:利用深度优先搜索法 找到一个1以后就对上下左右进行搜索,然后把岛屿数+1,并把这个1标记为0. int nr = grid.size(); if(!nr){ return 0; } int nc = grid[0].size(); int num_islands = 0;//记录岛屿的数量 for(int r = 0;r<nr;r++){ for(int c = 0;c<nc;c++){ if(grid[r][c] =='1'){ ++num_islands; //开始遍历 如果某个位置的数是1,那么开始深度搜素 dfs(grid,r,c); } } } return num_islands; } };

方法二:广度优先搜索(BFS,无栈溢出风险)

1. 核心思路

和 DFS 逻辑完全等价,只是用队列代替递归栈,避免大网格下的栈溢出问题:

  1. 遍历网格,遇到'1'岛屿数 + 1
  2. 把当前'1'入队,标记为'0'
  3. 队列不为空时,取出队首节点,把它的上下左右四个方向的'1'入队并标记为'0'
  4. 队列为空时,当前岛屿遍历完成,继续找下一个'1'
class Solution { public: int numIslands(vector<vector<char>>& grid) { int nr = grid.size(); if(!nr) return 0; int nc = grid[0].size(); int num_islands = 0; for(int r = 0;r< nr;++r){ for(int c = 0;c<nc;++c){ if(grid[r][c] == '1'){ ++num_islands; grid[r][c] = '0'; queue<pair<int,int>> neighbors;//创建队列 存pair neighbors.push({r,c});//把该点坐标存进去 while(!neighbors.empty()){ //不为空则循环 auto rc = neighbors.front(); neighbors.pop(); int row = rc.first, col = rc.second; if (row - 1 >= 0 && grid[row-1][col] == '1') { neighbors.push({row-1, col}); grid[row-1][col] = '0'; } if (row + 1 < nr && grid[row+1][col] == '1') { neighbors.push({row+1, col}); grid[row+1][col] = '0'; } if (col - 1 >= 0 && grid[row][col-1] == '1') { neighbors.push({row, col-1}); grid[row][col-1] = '0'; } if (col + 1 < nc && grid[row][col+1] == '1') { neighbors.push({row, col+1}); grid[row][col+1] = '0'; } } } } } return num_islands; } };
http://www.jsqmd.com/news/900503/

相关文章:

  • 从Blender Shape Key到UE Morph Target:一份给技术美术的完整配置与调试指南
  • Windows命令行利器:Hexdump十六进制文件解析实战
  • GPT-5.5助力项目经理:智能拆解任务与精准排期实战指南
  • 全局/静态区的变量在程序中的生命周期是如何确定的?
  • 有哪些AI写作辅助软件是真的懂学术语言,而不是胡乱堆砌?
  • 5分钟彻底解决机械键盘连击问题:免费开源防抖工具终极指南
  • ChatGPT声明怎么写才不翻车?:从OpenAI内部备忘录拆解7条合规红线与舆情响应时效阈值
  • CICV2026|51Sim分享面向物理AI的下一代仿真体系
  • 阿姆智创IBOX-6076R工控一体机,机器视觉设备控制升级
  • OpenAI半年寻得CMO Colin Fleming,他能否破解商业化与舆论难题?
  • FP7125停产断供?替代物料FP7135详解来了
  • 哪个品牌的红茶口碑好?参考2025年-2026年权威数据六个红茶品牌测评
  • GMS 1.4 YYC编译的游戏,如何安全地修改里面的文字和图片?(附UndertaleModTool实战)
  • 告别盲目单步!Keil5调试STM32的5个高效技巧:变量监视、逻辑分析、命令窗口实战
  • Vue项目里用Highcharts+Canvas画频谱瀑布图,30ms刷新也不卡(附完整代码)
  • 修复Windows+Ubuntu双系统引导丢失?EasyUEFI比EasyBCD更管用
  • 别再只看Top-1了!用Python代码实战解析Rank-1与Rank-5正确率,帮你更懂模型真实能力
  • OPC中国是什么?一文读懂智能体来了旗下OPC开源共创社区
  • 海口律师事务所提供高质量离婚和房产法律咨询服务
  • 别再只会ls了!用C语言opendir/readdir遍历目录,实现你的第一个文件管理器
  • UE4玻璃和水面材质实战:从折射率到光照模式,手把手调出真实半透明效果
  • 百度文心助手 LeetCode 2751. 机器人碰撞 C语言实现
  • 力扣HOT100(35)回溯-全排列
  • 基于可靠性的直接Turbo译码器RCODD的FPGA实现与优化
  • 技术笔记 | 解析SQR-PR300管道机器人
  • 2026年零基础适配!新手友好型AI自动化测试工具测评
  • MSP430F5529新手避坑指南:CCS导入driverlib库报错?手把手教你搞定环境搭建
  • 老工控机升级记:Win7 64位下搞定WinCC 7.0 SP3与PC Access SP6通讯(附完整避坑清单)
  • 科创50、科创100与科创200的底层逻辑重构
  • 天龙八部单机版GM工具终极指南:5分钟快速掌握游戏数据管理