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

力扣第200题 岛屿数量

前言

记录一下刷题历程 力扣第200题 岛屿数量


岛屿数量

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

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

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

示例 1:

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]
输出:1
示例 2:

输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]
输出:3

分析

网格由’1’(陆地)和’0’(水域)组成,岛屿被定义为一组相连的陆地。相连的陆地可以是水平或垂直相邻,但不能是对角线相邻。我们使用广度优先搜索(从某个节点出发,始终优先访问距离最近的顶点,并一层层向外扩张)来搜索每一个岛屿,我们可以使用一个队列来辅助BFS搜索

代码如下:

class Solution {
public:
    // 计算岛屿数量的主函数
    int numIslands(vector<vector<char>>& grid) {
        int nums = 0; // 记录岛屿数量
        int rows = grid.size(); // 获取网格的行数
        if (!rows) return nums; // 如果行数为0,直接返回0
        int cols = grid[0].size(); // 获取网格的列数
        
        // 创建一个与grid同样大小的访问标记数组
        vector<vector<bool>> visit(rows, vector<bool>(cols, false));
        
        // 遍历网格中的每一个元素
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                // 如果当前元素为'1'(表示陆地)且没有被访问过
                if (grid[row][col] == '1' && !visit[row][col]) {
                    bfs(grid, row, col, visit); // 执行BFS遍历
                    nums++; // 每发现一个岛屿,岛屿数量+1
                }
            }
        }
        return nums; // 返回最终的岛屿数量
    }

    // BFS函数,用来遍历一个岛屿的所有部分
    void bfs(vector<vector<char>>& grid, int row, int col, vector<vector<bool>>& visit) {
        queue<pair<int, int>> q; // 用队列来辅助BFS遍历
        q.push({row, col}); // 将当前起始点加入队列
        visit[row][col] = true; // 标记该点为已访问
        // 方向数组,表示上下左右四个方向
        vector<vector<int>> dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
        
        // 当队列不为空时,持续执行BFS
        while (!q.empty()) {
            pair<int, int> temp = q.front(); // 获取队列头部的坐标
            q.pop(); // 弹出队列头部
            
            // 遍历当前节点的上下左右四个方向
            for (int i = 0; i < dirs.size(); i++) {
                int temp_row = temp.first + dirs[i][0]; // 计算新的行坐标
                int temp_col = temp.second + dirs[i][1]; // 计算新的列坐标
                
                // 检查新坐标是否在网格范围内,是否为'1',且未访问过
                if (temp_row >= 0 && temp_row < grid.size() && 
                    temp_col >= 0 && temp_col < grid[0].size() && 
                    grid[temp_row][temp_col] == '1' && !visit[temp_row][temp_col]) {
                    
                    q.push({temp_row, temp_col}); // 将新坐标加入队列
                    visit[temp_row][temp_col] = true; // 标记该点为已访问
                }
            }
        }
    }
};

http://www.kler.cn/news/305677.html

相关文章:

  • 前端工程化3:使用lerna管理多包
  • 一图读懂 若依后端
  • JavaScript web API part3
  • PCIe进阶之TL:Address Spaces, Transaction Types, and Usage
  • Java多线程1
  • Android13 Launcher3屏蔽桌面指示器
  • 外包干了半年,快要废了。。。
  • 【c++】类和对象详解
  • React18快速入门
  • 切换淘宝最新镜像源npm
  • VSCode学习笔记
  • Linux开发讲课44---linux性能查看命令和工具
  • 在职研生活学习--20240907
  • FaaS(Function as a Service)框架集成springboot
  • 【数据结构-一维差分】力扣2848. 与车相交的点
  • MySQL 8.0授权语法变更及解决方案‌
  • 点云深度学习系列:Sam2Point——基于提示的点云分割
  • 2024上半年国产操作系统卖疯了!麒麟4.9亿,统信1.9亿!
  • 架构设计:负责网络、定时、坐下、站起、重连等,支持多类游戏的无锁房间
  • Oracle发送邮件功能:配置自动化发信指南?
  • Redis搭建集成
  • 【ACM独立出版】第二届物联网与云计算技术国际学术会议 (IoTCCT 2024,9月27-29)
  • BookStack在线文档管理系统本地Docker部署与远程访问详细教程
  • 安全运维工程师学习路线
  • Unity实现自己的协程系统
  • RFB_modified模块的作用?和ASPP模块的区别?
  • GLSL 棋盘shader
  • STM32 HAL freertos零基础(六)计数型信号量
  • 十二,Spring Boot 异常处理(自定义异常页面,全局异常,自定义异常)
  • 视频融合共享平台LntonAIServer视频分析平台噪声监测优势