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

【算法面试必刷】200. 岛屿数量

目录

题目

题目链接

思路

复杂度

代码


题目

给你一个由'1'(陆地)和'0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

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

此外,你可以假设该网格的四条边均被水包围。

题目链接

200. 岛屿数量 - 力扣(LeetCode)https://leetcode.cn/problems/number-of-islands/description/?envType=study-plan-v2&envId=top-100-liked

思路

  1. 遍历整个网格:对每个格子进行检查

  2. 发现新岛屿:如果遇到'1',说明发现一个新岛屿,计数器加1

  3. 淹没整个岛屿:通过 DFS 把与这个'1'相连的所有'1'都变成'0'(避免重复计数)

  4. 继续遍历:直到所有格子都检查完

复杂度

  • 时间复杂度:O(n × m)

    • 每个格子最多被访问一次(变成'0'后不再访问)

    • DFS 的总调用次数等于陆地的格子数

    • 最坏情况全是陆地,需要访问所有格子

  • 空间复杂度:O(n × m)

    • 最坏情况全是陆地,递归深度可能达到 n × m(但实际受栈限制)

    • 访问数组v的大小为 n × m

代码

class Solution { public: // 访问标记数组,记录格子是否被访问过 bool v[1010][1010]; // 四个方向的移动向量:下、右、上、左 int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; int ans = 0; // 岛屿数量计数器 /** * 深度优先搜索,将整个岛屿淹没(变成'0') * @param x 当前格子的行坐标 * @param y 当前格子的列坐标 * @param grid 网格引用(会被修改) */ void dfs(int x, int y, vector<vector<char>>& grid) { int n = grid.size(); // 网格行数 int m = grid[0].size(); // 网格列数 // 标记当前格子已访问 v[x][y] = 1; // 将当前陆地变成水(淹没) if (grid[x][y] == '1') { grid[x][y] = '0'; } // 尝试四个方向移动 for (int i = 0; i < 4; i++) { int xx = x + dx[i]; // 新位置的行 int yy = y + dy[i]; // 新位置的列 // 检查是否可以继续搜索: // 1. 不能越界 // 2. 不能访问过 // 3. 不能是水('0') if (xx < 0 || yy < 0 || xx >= n || yy >= m || v[xx][yy] || grid[xx][yy] == '0') { continue; } // 递归搜索相邻陆地 dfs(xx, yy, grid); } } /** * 计算岛屿数量 * @param grid 二维字符网格 * @return 岛屿数量 */ int numIslands(vector<vector<char>>& grid) { int n = grid.size(); int m = grid[0].size(); // 初始化访问标记(也可以直接用grid本身标记,这里保留v数组) memset(v, 0, sizeof(v)); ans = 0; // 遍历整个网格 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { // 发现新岛屿(遇到'1') if (grid[i][j] == '1') { ans++; // 岛屿数量加1 dfs(i, j, grid); // 淹没整个岛屿 } } } return ans; } };
http://www.jsqmd.com/news/440556/

相关文章:

  • 搞懂这两个组件,Spring 配置问题少一半!
  • 3.5 Spring Boot的配置文件
  • RASPI裸机7(exceptions)(TODO)
  • 【电力系统】储能调峰调频模型优化求解附Matlab代码
  • 00.状态码
  • 2026年热门的侧装缓冲滑轨厂家推荐:钢珠缓冲滑轨/抽屉缓冲滑轨/骑马抽缓冲滑轨值得信赖的生产厂家 - 行业平台推荐
  • 2026年知名的无油空压机品牌推荐:往复式空压机/活塞往复式空压机/直联便携式空压机源头厂家推荐几家 - 行业平台推荐
  • Go 加密性能极限优化实战手册
  • 详细介绍:spring boot项目欢迎页设置方式
  • Skills搭建全流程,看完你的Skills就牛了!存一下吧!
  • 北京的 Clara ,她是如何从一个小白开始做出海独立站的
  • 2026年DeepSeek推广公司有哪些?联系方式与服务对比一览 - 品牌2026
  • ngx_http_index_set_index
  • 2026年知名的废气处理公司推荐:西安废气处理/陕西废气处理工程制造厂家哪家靠谱 - 行业平台推荐
  • 力扣 第491场周赛(A~D)
  • 00.HTTP 常见状态码
  • C语言联合体&枚举
  • Any Video Downloader:免费全能视频下载利器,8K高清一键保存
  • 2026年比较好的轻钢龙骨公司推荐:防腐轻钢龙骨/装配式轻钢龙骨实力厂家如何选 - 行业平台推荐
  • 【小白笔记】功能函数与主函数的布局
  • 短视频运营资源合集
  • C++游戏开发之旅 24
  • 2026年知名的单轨吊马达公司推荐:气动单轨吊车/单轨吊气动葫芦实力工厂推荐 - 行业平台推荐
  • 体态矫正资源合集
  • 【2026年最新600套毕设项目分享】基于SpringBoot+Vue的知识产权管理系统(14060)
  • 【小白笔记】迭代与递归的区别
  • Mac双开微信终极指南:一台电脑轻松登录两个微信账号 - 指南
  • 在Revit中创建并导入文字渲染模型的步骤详解
  • 北京DeepSeek推广公司有哪些?2026年GEO服务商能力与定位解析 - 品牌2026
  • 计数公式总结