news 2026/8/31 16:28:40

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【算法面试必刷】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; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 23:35:29

云主机ubuntu24上安装openclaw操作步骤详解,避坑指南

在本机ubuntu22上按openclaw.ai官网上的提示&#xff0c;安装它一次性成功&#xff0c;但毕竟不敢把工作电脑完全交给openclaw&#xff0c;权限放多了有风险&#xff0c;不放权限它又做不了一个真正的智能管家。为此&#xff0c;买了一个腾讯海外版的云主机&#xff0c;首年才1…

作者头像 李华
网站建设 2026/8/30 23:15:58

C#静态构造函数真的总是最先执行吗?

在 C# 开发圈子里&#xff0c;有一个流传很广的说法&#xff0c;甚至经常被当成面试题&#xff1a;“当第一次访问某个类型时&#xff0c;该类型的静态构造函数一定会最先执行。”听起来好像挺有道理&#xff0c;但严格来说&#xff0c;这个说法并不完全准确。根据 ECMA-335 CL…

作者头像 李华
网站建设 2026/8/31 0:20:50

奇淫巧技,CompletableFuture 异步多线程是真的优雅

一个示例回顾Future一些业务场景我们需要使用多线程异步执行任务&#xff0c;加快任务执行速度。JDK5新增了Future接口&#xff0c;用于描述一个异步计算的结果。虽然 Future 以及相关使用方法提供了异步执行任务的能力&#xff0c;但是对于结果的获取却是很不方便&#xff0c;…

作者头像 李华
网站建设 2026/8/31 0:40:21

4万字硬核剖析,Kafka 面试 30问( 高级篇)

今天我们就来安排一篇关于 Kafka 的核心面试题连环炮, 从「基础知识」、「进阶提升」、「架构调优」 三个方向梳理面试题&#xff0c;希望在金三银四的关键节点可以帮助到大家。 由于内容很多&#xff0c;打算拆分成「上中下」三篇&#xff0c;本文是面试系列的下篇。 这篇文…

作者头像 李华
网站建设 2026/8/30 23:16:02

“政务场景AI落地”并非替代人力,而是通过技术赋能,让政务工作者更专注于需要判断力、共情力与协调力的核心职责

什么是政务场景AI落地&#xff1f;“政务场景AI落地”是指将人工智能技术&#xff0c;结合政务服务的实际业务流程、用户需求与制度规范&#xff0c;进行定制化开发、系统集成与持续运营&#xff0c;最终在真实政务环境中稳定运行并产生可衡量价值的过程。它不是单纯的技术演示…

作者头像 李华