【图论】200. 岛屿问题
200. 岛屿问题
难度:中等
力扣地址:https://leetcode.cn/studyplan/top-100-liked/

问题描述
给你一个由 '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.lengthn==grid[i].length1<=m,n<=300grid[i][j]的值为'0'或'1'
问题分析
有没有小伙伴跟我一样,这类题目一看就想尝试一下深度优先遍历 DFS ?
DFS 写起来比较简单,也比较容易理解,所以真心推荐合适场景下考虑 DFS。
如下图所示,白色筷子表示 “水”,也就是遍历时的边界。

所以接下的问题就非常简单,我们从 (0, 0) 这个坐标出发,如果是陆地就 travel,也就是 DFS 遍历,如果是水,就修改方向,如果没有地方去了,就切换到下一个陆地。
(为了更好理解,我们可以考虑:把经过的陆地,全部都换成水,避免下次还来这个地方)
解题代码
对应的 C++ 代码如下:
class Solution {
public:void travel(vector<vector<char>>& grid, int x, int y) {// 遇到边界或没有可访问的点if (x >= grid.size() || x < 0 || y >= grid[0].size() || y < 0 || grid[x][y] == '0') {return;}// 标记一下已经访问grid[x][y] = '0';// 四个方向 traveltravel(grid, x + 1, y);travel(grid, x - 1, y);travel(grid, x, y + 1);travel(grid, x, y - 1);}int numIslands(vector<vector<char>>& grid) {// 记录结果int result = 0;// 根据 (i, j) 开始尝试 travelfor (int i = 0; i < grid.size(); i++) {for (int j = 0; j < grid[0].size(); j++) {// 如果遇到的这个点是陆地if (grid[i][j] == '1') {// 开始traveltravel(grid, i, j);// travel 结束后 + 1,表示那一片陆地已经访问过了result += 1;}}}return result;}
};
- 时间复杂度:O(MN)
- 空间复杂度:O(MN)

对应的 java 代码如下:
class Solution {// 定义 travel 方法public void travel(char[][] grid, int x, int y) {// 遇到边界或没有可访问的点if (x >= grid.length || x < 0 || y >= grid[0].length || y < 0 || grid[x][y] == '0') {return;}// 标记已经访问过的点grid[x][y] = '0';// 四个方向进行递归调用travel(grid, x + 1, y);travel(grid, x - 1, y);travel(grid, x, y + 1);travel(grid, x, y - 1);}// 定义 numIslands 方法public int numIslands(char[][] grid) {// 记录结果int result = 0;// 遍历整个网格for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {// 如果遇到陆地if (grid[i][j] == '1') {// 开始进行递归访问travel(grid, i, j);// 访问结束后计数加一result++;}}}// 返回结果return result;}
}
对应的python代码为
class Solution:def travel(self, grid, x, y):# 遇到边界或没有可访问的点if x >= len(grid) or x < 0 or y >= len(grid[0]) or y < 0 or grid[x][y] == '0':return# 标记已经访问过的点grid[x][y] = '0'# 四个方向进行递归调用self.travel(grid, x + 1, y)self.travel(grid, x - 1, y)self.travel(grid, x, y + 1)self.travel(grid, x, y - 1)def numIslands(self, grid):# 记录结果result = 0# 遍历整个网格for i in range(len(grid)):for j in range(len(grid[0])):# 如果遇到陆地if grid[i][j] == '1':# 开始进行递归访问self.travel(grid, i, j)# 访问结束后计数加一result += 1# 返回结果return result
总结
作为 DFS 的一个比较简单的例子,限制条件也比较少,只需要考虑边界问题即可。先应该学习一下 DFS 的基本逻辑,然后能够写 DFS 的代码,在此基础上稍微改改就可以刷这道题。
我更加想称这个操作为防水游戏,就是把每块岛屿都用海水淹没,看看需要操作多少次。
多谢小伙伴们的点赞支持 ~
Smileyan
2024.06.30 23:52
相关文章:
【图论】200. 岛屿问题
200. 岛屿问题 难度:中等 力扣地址:https://leetcode.cn/studyplan/top-100-liked/ 问题描述 给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围&…...
AI学习指南机器学习篇-随机森林的优缺点
AI学习指南机器学习篇-随机森林的优缺点 引言 机器学习是人工智能领域的重要分支,其中随机森林(Random Forest)算法以其高性能和广泛应用而备受瞩目。然而,就像任何其他算法一样,随机森林也有其优缺点。本文将深入探讨随机森林算法的优势和…...
基于boost::beast的http服务器(上)
文章目录 1.beast网落库介绍2.相关类及api3.异步读写的处理3.1异步写案例3.2异步读案例 1.beast网落库介绍 Beast网络库是一个基于Boost库的C网络库,特别用于开发高性能的网络应用程序。它提供了一组易于使用的API,主要用于处理HTTP和WebSocket协议&…...
深度学习之近端策略优化(Proximal Policy Optimization,PPO)
PPO(Proximal Policy Optimization,近端策略优化)是深度强化学习中的一种算法,属于策略梯度方法中的一种。PPO通过优化策略来最大化累积奖励,具有稳定性好、易于调参等优点,是目前广泛应用的一种深度强化学习算法。下面介绍PPO的基本原理和流程。 PPO基本原理 PPO算法的…...
用pycharm进行python爬虫的步骤
使用 pycharm 进行 python 爬虫的步骤:下载并安装 pycharm。创建一个新项目。安装 requests 和 beautifulsoup 库。编写爬虫脚本,包括获取页面内容、解析 html 和提取数据的代码。运行爬虫脚本。保存和处理提取到的数据。 用 PyCharm 进行 Python 爬虫的…...
重写功能 rewrite
Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之 一,用于实现URL的重写,URL的…...
ISO19110操作要求类中/req/operation/operation-attributes的详细解释
/req/operation/operation-attributes 要求: 只有要素属性(feature attributes)可以通过‘observesValueOf’、‘triggeredByValuesOf’或‘affectsValuesOf’关联角色与要素操作(feature operations)关联。 具体解释 定义 要…...
访客(UV)、点击量(PV)、IP、访问量(VV)概念
1、https://www.cnblogs.com/QingPingZm/articles/13855808.htmlhttps://www.cnblogs.com/QingPingZm/articles/13855808.html...
C++系统编程篇——Linux第一个小程序--进度条
(1)先引入一个概念:行缓冲区 \r和\n \r表示回车 \n表示回车并换行 ①代码一 #include<stdio.h> #include<unistd.h> int main()…...
一个中文和越南语双语版本的助贷平台开源源码
一个中文和越南语双语版本的助贷平台开源源码。后台试nodejs。 后台 代理 前端均为vue源码,前端有中文和越南语。 前端ui黄色大气,逻辑操作简单,注册可对接国际短信,可不对接。 用户注册进去填写资料,后台审批&…...
【游戏引擎之路】登神长阶(五)
5月20日-6月4日:攻克2D物理引擎。 6月4日-6月13日:攻克《3D数学基础》。 6月13日-6月20日:攻克《3D图形教程》。 6月21日-6月22日:攻克《Raycasting游戏教程》。 6月23日-6月30日:攻克《Windows游戏编程大师技巧》。 …...
FireAct:使用智能体(agent)微调大语言模型
1.概述 近年来,针对语言模型(LMs)的研究致力于探索其与外部工具或环境互动的能力,以推进新型语言代理的发展。此类代理具备从环境反馈中汲取新知识、通过语言推理进行连续决策,以及借助自我反思提升任务解决能力的能力。工业界的进展,如ChatGPT插件,凸显了语言代理在实际…...
20240626让飞凌的OK3588-C开发板在相机使用1080p60分辨率下预览
20240626让飞凌的OK3588-C开发板在相机使用1080p60分辨率下预览 2024/6/26 15:15 4.2.1 全编译测试 在源码路径内,提供了编译脚本 build.sh,运行该脚本对整个源码进行编译,需要在终端切换到解压 出来的源码路径,找到 build.sh 文件…...
python数据分析——数据分类汇总与统计
数据分类汇总与统计 前言一、Groupby分类统计语法按列分组示例一示例二示例三 遍历各分组示例 使用字典和Series分组示例 使用函数分组示例 二、数据聚合groupby的聚合函数示例一示例二 逐列及多函数应用示例一示例二 返回不含行索引的聚合数据示例 三、一般性的“拆分-应用-合…...
iOS17系统适配
iOS17 新功能 文章目录 iOS17 新功能iOS17支持哪几款机型Xcode15新特性iOS17-开发适配指南 横屏待机 在iOS 17中,还带来了横屏待机功能,苹果将这个新功能命名为“Standby”模式,为 iPhone 带来了全新的玩法。iPhone启用之后,默认情…...
树洞陪聊陪玩交友程序系统源码,解锁交友新体验
在繁忙的都市生活中,你是否渴望找到一片属于自己的秘密花园,倾诉心声、分享快乐?今天,就让我带你走进这片名为“树洞”的神秘之地,感受陪聊陪玩交友的全新魅力! 🌳树洞陪聊陪玩交友程序系统 你…...
区间动态规划——最长回文子序列长度(C++)
把夜熬成粥,然后喝了它。 ——2024年7月1日 书接上回:区间动态规划——最长回文子串(C)-CSDN博客,大家有想到解决办法吗? 题目描述 给定一个字符串s(s仅由数字和英文大小写字母组成࿰…...
无人机远程控制:北斗短报文技术详解
无人机(UAV)技术的快速发展和应用,使得远程控制成为了一项关键技术。无人机远程控制涉及无线通信、数据处理等多个方面,其中北斗短报文技术以其独特的优势,在无人机远程控制领域发挥着重要作用。本文将详细解析无人机远…...
240627_关于CNN中图像维度变化问题
240627_关于CNN中图像维度变化问题 在学习一些经典模型时,其中得维度变化关系总搞不太明白,集中学习了以下,在此作以梳理总结: 一般来说涉及到的维度变换都是四个维度,当batch size4,图像尺寸为640*640&a…...
食品行业怎么用JSON群发短信
食品作为日常生活不可缺少的元素,市场需求是很稳定的,但是份额就那么多,商家都要来抢占的话,就需要运营推广各凭本事,市场运营中选择合适的推广方式,可以增加店铺销售额,很多实体店或商城都会建…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
