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

LeetCode岛屿数量

题目描述

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

解题思路

岛屿问题是网格 DFS 问题的典型代表,我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而岛屿 DFS 问题,是在一种「网格」结构中进行的。

我们首先明确一下岛屿问题中的网格结构是如何定义的,以方便我们后面的讨论。

网格问题是由 m×n 个小方格组成一个网格,每个小方格与其上下左右四个方格认为是相邻的,要在这样的网格上进行某种搜索。

岛屿问题是一类典型的网格问题。每个格子中的数字可能是 0 或者 1。我们把数字为 0 的格子看成海洋格子,数字为 1 的格子看成陆地格子,这样相邻的陆地格子就连接成一个岛屿。
在这里插入图片描述

网格结构中的格子有多少相邻结点?答案是上下左右四个。对于格子 (r, c) 来说(rc 分别代表行坐标和列坐标),四个相邻的格子分别是 (r-1, c)、(r+1, c)、(r, c-1)、(r, c+1)。换句话说,网格结构是「四叉」的。
在这里插入图片描述

代码

/*** @param {character[][]} grid* @return {number}*/
var numIslands = function(grid) {//深度优先let count = 0;let m = grid.length;let n = grid[0].length;const dfs = (i, j) => {if(i < 0 || j < 0 || i >= m || j >= n || grid[i][j] === '0') return;//下标越界或不是陆地,返回grid[i][j] = '0';//将陆地置为水,避免后续访问重复计算这个位置//检验它的上下左右方向有没有陆地dfs(i + 1, j);dfs(i - 1, j);dfs(i, j + 1);dfs(i, j - 1);}for(let i = 0; i < m; i++) {for(let j = 0; j < n; j++) {if(grid[i][j] === '1') {//找到陆地dfs(i, j);//找到这个陆地所属的一整块岛屿,整个岛屿原本的的'1'都被置为'0'count++;//岛屿数量增加}}}return count;
};

代码分析

  1. var numIslands = function(grid) {
    定义了一个名为 numIslands 的函数,它接受一个二维数组 grid 作为参数。

  2. let count = 0;
    声明一个变量 count 用来计数岛屿的数量,初始值为 0。

  3. let m = grid.length;
    获取网格的行数。

  4. let n = grid[0].length;
    获取网格的列数。

  5. const dfs = (i, j) => {
    定义一个名为 dfs 的函数,它接受两个参数 ij,分别代表当前要访问的网格的行和列的索引。

  6. if(i < 0 || j < 0 || i >= m || j >= n || grid[i][j] === '0') return;
    这是一个边界检查,确保不会访问网格外的元素,并且只有当当前位置是陆地(即 grid[i][j] 的值为 ‘1’)时,才会继续执行。

  7. grid[i][j] = '0';
    将当前位置标记为已访问,通过将其值改为 '0'

  8. dfs(i + 1, j);
    递归调用 dfs 函数,检查当前位置的下方是否有陆地。

  9. dfs(i - 1, j);
    递归调用 dfs 函数,检查当前位置的上方是否有陆地。

  10. dfs(i, j + 1);
    递归调用 dfs 函数,检查当前位置的右侧是否有陆地。

  11. dfs(i, j - 1);
    递归调用 dfs 函数,检查当前位置的左侧是否有陆地。

  12. for(let i = 0; i < m; i++) {
    开始一个外层循环,遍历每一行。

  13. for(let j = 0; j < n; j++) {
    开始一个内层循环,遍历每一列。

  14. if(grid[i][j] === '1') {
    检查当前位置是否是陆地。

  15. dfs(i, j);
    如果是陆地,调用 dfs 函数,从这个位置开始进行深度优先搜索,将整个岛屿标记为已访问。

这里每一块陆地通过这个函数都会变为海洋,不会影响其他陆地的搜索,下面直接统计数量

  1. count++;
    每找到一个岛屿,岛屿计数器 count 增加 1。

  2. return count;
    返回岛屿的总数。

这段代码的总体思路是使用深度优先搜索(DFS)来遍历整个网格。对于每个未被访问的陆地单元格,它都会递归地标记所有相邻的陆地单元格,直到没有更多的陆地可以访问。每完成一次这样的搜索,就意味着找到了一个岛屿,因此增加岛屿的计数。这个过程会一直重复,直到所有的陆地都被访问过。最后,函数返回找到的岛屿总数。

相关文章:

LeetCode岛屿数量

题目描述 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网…...

Karmada核心概念

以下内容为翻译&#xff0c;原文地址 Karmada 是什么&#xff1f; | karmada 一、Karmada核心概念 一&#xff09;什么是Karmada 1、Karmada&#xff1a;开放&#xff0c;多云&#xff0c;多集群Kubernetes业务流程 Karmada (Kubernetes Armada)是一个Kubernetes管理系统&…...

Rust 与生成式 AI:从语言选择到开发工具的演进

在现代软件开发领域&#xff0c;Rust 语言正在逐步崭露头角&#xff0c;尤其是在高性能和可靠性要求较高的应用场景。与此同时&#xff0c;生成式 AI 的崛起正在重新塑造开发者的工作方式&#xff0c;从代码生成到智能调试&#xff0c;生成式 AI 的应用正成为提升开发效率和质量…...

Python爬虫高效数据爬取方法

大家好!今天我们来聊聊Python爬虫中那些既简洁又高效的数据爬取方法。作为一名爬虫工程师,我们总是希望用最少的代码完成最多的工作。下面我ll分享一些在使用requests库进行网络爬虫时常用且高效的函数和方法。 1. requests.get() - 简单而强大 requests.get()是我们最常用的…...

C语言之扫雷小游戏(完整代码版)

说起扫雷游戏&#xff0c;这应该是很多人童年的回忆吧&#xff0c;中小学电脑课最常玩的必有扫雷游戏&#xff0c;那么大家知道它是如何开发出来的吗&#xff0c;扫雷游戏背后的原理是什么呢&#xff1f;今天就让我们一探究竟&#xff01; 扫雷游戏介绍 如下图&#xff0c;简…...

Spring WebFlux 响应式概述(1)

1、响应式编程概述 1.1、响应式编程介绍 1.1.1、为什么需要响应式 传统的命令式编程在面对当前的需求时的一些限制。在应用负载较高时&#xff0c;要求应用需要有更高的可用性&#xff0c;并提供低的延迟时间。 1、Thread per Request 模型 比如使用Servlet开发的单体应用&a…...

Unity游戏通用框架——事件的订阅和发布(观察者模式)

在游戏开发的基本思想中&#xff0c;逻辑与表现的分离极为重要&#xff0c;相互之间并不关心具体实现&#xff0c;只注册对应的事件&#xff0c;有事件发生时才调用相应的函数 事件管理器 using System.Collections; using System.Collections.Generic;public class event_ma…...

将 Ubuntu 系统中的 **swap** 空间从 2GB 扩展到 16GB

要将 Ubuntu 系统中的 swap 空间从 2GB 扩展到 16GB&#xff0c;可以按照以下步骤操作&#xff1a; 1. 关闭现有 Swap 文件 首先需要禁用当前的 swap 文件&#xff0c;以便重新调整其大小。 sudo swapoff -a2. 删除旧的 Swap 文件 假设当前的 swap 文件位于 /swapfile&…...

流程图 LogicFlow

流程图 LogicFlow 官方文档&#xff1a;https://site.logic-flow.cn/tutorial/get-started <script setup> import { onMounted, ref } from vue import { forEach, map, has } from lodash-es import LogicFlow, { ElementState, LogicFlowUtil } from logicflow/core …...

Mac通过键盘选取内容

问题&#xff1a; 我们在使用键盘的时候经常懒得动手去拿鼠标了&#xff0c;并且熟练使用键盘可以提高我们的工作效率&#xff0c;比如在我们需要复制内容的时候&#xff0c;可以仅仅通过键盘来选取想要的内容&#xff1b; 解决&#xff1a; 将鼠标光标移动到想要选取的内容…...

如何通过OpenCV实现图像融合拼接?

图像拼接的意义 2024年了&#xff0c;谈论图像拼接&#xff0c;不算新事物&#xff0c;我们这里探讨图像拼接&#xff0c;主要探讨图像拼接的意义、难点和大概的实现思路。图像拼接可以突破设备视野限制&#xff0c;通过拼接低分辨率图像获得高分辨率图像。 扩展视野&#xff…...

Qt5.14.2 安装详细教程(图文版)

Qt 是一个跨平台的 C 应用程序开发框架&#xff0c;主要用于开发图形用户界面&#xff08;GUI&#xff09;程序&#xff0c;但也支持非 GUI 程序的开发。Qt 提供了丰富的功能库和工具&#xff0c;使开发者能够在不同平台上编写、编译和运行应用程序&#xff0c;而无需修改代码。…...

深圳市步步精科技有限公司荣获发明专利,彰显技术研发实力

2024年8月13日&#xff0c;深圳市步步精科技有限公司&#xff08;BBJconn&#xff09;正式获得了其新开发的防水连接器专利&#xff0c;授权公告号为CN 118352837 B。这项技术的突破标志着公司在连接器领域的持续创新&#xff0c;进一步巩固了其行业领先地位。 专利技术概述 此…...

std::function的概念和使用方法

一、概念 std::function是 C 标准库中的一个模板类&#xff0c;定义在<functional>头文件中。它是一种通用的多态函数包装器&#xff0c;其实例能够对任何可调用对象进行存储、复制和调用操作&#xff0c;这些可调用对象包括普通函数、函数指针、成员函数指针、函数对象…...

OpenAI的Swarm是一个实验性质的多智能体编排框架

先上文档&#xff0c;然后解释&#xff0c;然后是代码 OpenAI的Swarm是一个实验性质的多智能体编排框架&#xff0c;旨在简化多智能体系统的构建、编排和部署。以下是对Swarm的详细介绍&#xff1a; 一、核心概念和特点 智能体&#xff08;Agent&#xff09;&#xff1a; Swar…...

简易STL实现 | Map 的实现

提供了键值对的存储机制&#xff0c;处理 具有唯一键的关联数据 1、特性 键值对存储&#xff1a;std::map 通过键值对的形式 存储数据&#xff0c;其中每个键 都是唯一的&#xff0c;并且 与一个值相关联 自动排序&#xff1a;std::map 内部 使用一种平衡二叉搜索树&#xf…...

`concurrent.futures` 是 Python 标准库中的一个模块

先来看文档 concurrent.futures 是 Python 标准库中的一个模块&#xff0c;它提供了一个高级接口来异步执行代码&#xff0c;使用线程或进程池来并行运行任务。这个模块提供了两种主要的池类型&#xff1a;ThreadPoolExecutor 和 ProcessPoolExecutor&#xff0c;以及一个通用的…...

PicoQuant GmbH公司Dr. Christian Oelsner到访东隆科技

昨日&#xff0c;德国PicoQuant公司的光谱和显微应用和市场专家Dr.Christian Oelsner莅临武汉东隆科技有限公司。会议上Dr. Christian Oelsner就荧光寿命光谱和显微技术的最新研究和应用进行了深入的交流与探讨。此次访问不仅加强了两家公司在高科技领域的合作关系&#xff0c;…...

leetcode128最长连续序列 golang版

题目描述 题目&#xff1a;给定一个未排序的整数数组 nums 找出数字连续的最长序列&#xff0c;不要求序列 元素在原数组中连续 的长度 请你设计并实现时间复杂度为On的算法解决此问题 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解释&…...

【OpenCV】(六)—— 阈值处理

阈值处理&#xff08;Thresholding&#xff09;用于将灰度图像转换为二值图像。通过设定一个或多个阈值&#xff0c;可以将图像中的像素分为不同的类别&#xff0c;通常用于分割前景和背景、简化图像、去除噪声等任务。OpenCV 提供了多种阈值处理方法&#xff0c;下面介绍基本阈…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...