Leetcode刷题详解——岛屿数量

1. 题目链接:200. 岛屿数量

2. 题目描述:

给你一个由 '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

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0''1'

3. 算法思路:

  1. 初始化一个与输入网格大小相同的二维布尔数组 vis,用于记录每个位置是否已经被访问过。初始时,所有位置都未被访问过,所以 vis 中的所有元素都为 false
  2. 获取输入网格的行数 m 和列数 n
  3. 定义一个整数变量 ret,用于记录岛屿的数量。初始值为 0。
  4. 使用两层嵌套循环遍历整个网格。对于每个位置 (i, j),执行以下操作:
    • 如果该位置未被访问过且其值为 ‘1’(表示陆地),则将 ret 的值加一,并调用 dfs 函数进行深度优先搜索。
  5. dfs 函数中,将当前位置标记为已访问(即将 vis[i][j] 设置为 true)。
  6. 使用四个方向的偏移量 dxdy,分别表示上、下、左、右四个方向。对于每个方向,计算新的坐标 (x, y),并检查其是否在网格范围内且未被访问过且值为 ‘1’。如果满足条件,则递归调用 dfs 函数继续搜索相邻的陆地。
  7. 当所有位置都被访问过后,返回岛屿的数量 ret

请添加图片描述

4. C++算法代码:

class Solution {vector<vector<bool>> vis; // 用于记录访问过的岛屿位置int m, n; // 网格的行数和列数
public:// 计算岛屿的数量int numIslands(vector<vector<char>>& grid) {m = grid.size(), n = grid[0].size();vis = vector<vector<bool>>(m, vector<bool>(n));int ret = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!vis[i][j] && grid[i][j] == '1') { // 如果当前位置未被访问过且为陆地ret++; // 岛屿数量加一dfs(grid, i, j); // 进行深度优先搜索}}}return ret;}int dx[4] = {0, 0, 1, -1}; // x轴方向的偏移量int dy[4] = {1, -1, 0, 0}; // y轴方向的偏移量// 深度优先搜索函数void dfs(vector<vector<char>>& grid, int i, int j) {vis[i][j] = true; // 标记当前位置已访问for (int k = 0; k < 4; k++) {int x = i + dx[k], y = j + dy[k]; // 计算相邻位置的坐标if (x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && grid[x][y] == '1') { // 如果相邻位置在网格内且未被访问过且为陆地dfs(grid, x, y); // 继续进行深度优先搜索}}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/193460.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ之延迟队列(万字总结,手把手教你学习延迟队列)

文章目录 一、延迟队列概念二、延迟队列使用场景三、RabbitMQ 中的 TTL1、队列设置 TTL2、消息设置 TTL3、两者的区别 四、整合 springboot1、添加依赖2、修改配置文件3、添加 Swagger 配置类 五、队列 TTL1、代码架构图2、配置文件类代码3、消息生产者代码4、消息消费者代码 六…

Java GUI小程序之图片浏览器

以下是一个简单的图片浏览器示例代码&#xff0c;它包含了图片放大缩小、拖拽、上一张/下一张查看等功能。你可以根据它进行扩展&#xff0c;提高用户体验。 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.e…

Linux系统编程——进程中vfork函数

函数原型 pid_t vfork(void);//pid_t是无符号整型 所需头文件 #include <sys/types.h> #include <unistd.h> 功能 vfork() 函数和 fork() 函数一样都是在已有的进程中创建一个新的进程&#xff0c;但它们创建的子进程是有区别的。 返回值 成功子进程中返回 …

如何使用内网穿透实现远程公网访问windows node.js的服务端

使用Nodejs搭建简单的web网页并实现公网访问 前言 Node.js是建立在谷歌Chrome的JavaScript引擎(V8引擎)的Web应用程序框架。 Node.js自带运行时环境可在Javascript脚本的基础上可以解释和执行(这类似于JVM的Java字节码)。这个运行时允许在浏览器以外的任何机器上执行JavaScri…

Zookeeper 命令使用和数据说明

文章目录 一、概述二、命令使用2.1 登录 ZooKeeper2.2 ls 命令&#xff0c;查看目录树&#xff08;节点&#xff09;2.3 create 命令&#xff0c;创建节点2.4 delete 命令&#xff0c;删除节点2.5 set 命令&#xff0c;设置节点数据2.6 get 命令&#xff0c;获取节点数据 三、数…

在 Electron上安装better-sqlite3出错

错误问题 一直卡npm install --global windows-build-tools --vs2015 这一步 解决 安装&#xff1a;pnpm install better-sqlite3 --save安装命令 pnpm i -D electron-rebuild 手动运行&#xff1a;node_modules/.bin/electron-rebuild -f -w better-sqlite3 我直接在packa…

一文了解VR全景拍摄设备如何选择,全景图片如何处理

引言&#xff1a; 在如今的数字化时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术不仅为我们的生活增添了许多乐趣&#xff0c;也为摄影领域带来了新的摄影方式&#xff0c;那么VR全景拍摄如何选择设备&#xff0c;全景图片又怎样处理呢&#xff1f; 一. VR全景拍摄设…

创建数据透视表:根据表中一列作为分类的依据统计每个类别下不同子项数量cross_tab()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 创建数据透视表&#xff1a; 根据表中一列作为分类的依据 统计每个类别下不同子项数量 cross_tab() [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd data{A:[a1,a2,a1,a2,a…

给VSCode插上一双AI的翅膀

#AI编程助手哪家好&#xff1f;DevChat“真”好用# 文章目录 前言一、安装DevChat1.1、访问地址1.2、注册1.3、在VSCode里安装DevChat插件1.3.1、未安装状态1.3.2、已安装状态 二、设置Access Key2.1. 点击左下角管理&#xff08;“齿轮”图标&#xff09;—命令面板&#xff…

vscode远程linux安装codelldb

在windows上使用vscode通过ssh远程连接linux进行c调试时&#xff0c;在线安装codelldb-x86_64-linux.vsix扩展插件失败&#xff0c;原因是linux服务器上的网络问题&#xff0c;所以需要进行手动安装。 首先在windows上下载&#xff1a; codelldb-x86_64-linux.vsix&#xff1b;…

打开word文档报错,提示HRESULT 0x80004005 位置: 部分: /word/comments.xml,行: 0,列: 0

某用户遇到这样一个奇怪的问题&#xff0c;就是回复完word的批注后&#xff0c;保存文档再打开就会报错&#xff0c;提示很抱歉&#xff0c;无法打开XXX&#xff0c;因为内容有问题。&#xff0c;详细信息提示HRESULT 0x80004005 位置: 部分: /word/comments.xml,行: 0,列: 0 c…

iOS性能优化

了解屏幕成像的原理。 有一个电子枪然后在很多横轴方向上 发射电子&#xff0c;不同横轴的电子枪根据显示器中的硬件时钟产生一系列的定时信号&#xff0c;以此来让电子以不同的时间发射出去 这些电子一瞬间的运动形成了一帧动画。 CPU优化&#xff1a; 1.文本计算优化 如果一…

docker 安装xxl-job

1.拉取镜像 docker pull xuxueli/xxl-job-admin:2.4.0 2.docker镜像创建并运行 docker run -e PARAMS"--spring.datasource.urljdbc:mysql://xxxxx:3306/xxl_job?useUnicodetrue&characterEncodingUTF-8&autoReconnecttrue&serverTimezoneAsia/Shanghai&…

C# 将PDF文档转换为Word文档

一.开发框架&#xff1a; .NetCore6.0 工具&#xff1a;Visual Studio 2022 二.思路&#xff1a; 1.使用SHA256Hash标识文档转换记录&#xff0c;数据库已经存在对应散列值&#xff0c;则直接返还已经转换过的文档 2.数据库没有对应散列值记录的话&#xff0c;则保存上传PDF…

深入Android S(12.0) 探索 Android Framework 之 SystemServer 进程启动详解

深入学习 Android Framework 第三&#xff1a;深入Android S(12.0) 探索 Android Framework 之 SystemServer 进程启动详解 文章目录 深入学习 Android Framework前言一、Android 系统的启动流程1. 流程图2. 启动流程概述 二、源码详解1. 时序图2. 源代码1、ZygoteInit # main…

Java14新增特性

前言 前面的文章&#xff0c;我们对Java9、Java10、Java11、Java12 、Java13的特性进行了介绍&#xff0c;对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 今天我们来一起看一下Java14这个版本的一些重要信息 版本介绍 Java 14…

21 Linux 自带的LED驱动

一、Linux 自带 LED 驱动使能 其实 Linux 内核自带 LED 抢夺那个&#xff0c;但在此之前需要配置 Linux 驱动来使能 LED 驱动。 输入以下命令&#xff1a; cd linux/atk-mpl/linux/my_linux/linux-5.4.31 make menuconfig 根据以下路径找到 LED 驱动&#xff1a; → Device D…

Python OpenCV 通过trackbar调整图像亮度对比度颜色

上一篇文章通过设置固定值的方式来调整图像&#xff0c;这篇文章通过trackbar来动态调整参数&#xff0c;从而实时展现图像处理结果&#xff0c;得到想要的图像处理参数。 1. 创建trackbar import cv2 import numpy as npdef nothing(x):passcv2.namedWindow(image) # 创建5个…

【原创】java+swing+mysql个人日记管理系统设计与实现

摘要&#xff1a; 个人日记管理系统是一个可以记录、管理、存储和检索个人日记的应用程序。这个系统允许用户创建和管理多个日记帐户&#xff0c;每个帐户都可以有多个日记条目。用户可以随时添加、编辑或删除日记条目&#xff0c;并可以将这些条目按照主题或其他标准进行分类…

【C++】深拷贝与浅拷贝

1、深拷贝与浅拷贝 当我们对复杂类型(结构体或者类)的对象进行初始化时&#xff0c;如果将同类型的对象A赋值给同类型的对象B&#xff0c;此时就涉及深拷贝和浅拷贝的问题。 浅拷贝&#xff1a;简单的赋值拷贝操作。把类/结构体的对象的属性原封不动的赋值给另一个同类型的对…