关于岛屿的三道leetcode原题:岛屿周长、岛屿数量、统计子岛屿
题1:岛屿周长
给定一个 row x col 的二维网格地图 grid ,其中:gridi = 1 表示陆地, gridi = 0 表示水域。
网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。
岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。
示例:

思路:
一块土地原则上会带来4个周长,但岛上的土地存在接壤,会减掉2个边长。
所以,总周长=4*土地个数-2*接壤边的条数
遍历矩阵,遍历到土地,就land++,如果它的右边或下边也是土地,则border++,便遍历结束后代入公式即可。

Code:
int islandPerimeter(int** grid, int gridSize, int* gridColSize){int land=0;//土地的块数int broader=0;//土地接壤的块数for(int i=0;i<gridSize;i++){for(int j=0;j<gridColSize[i];j++){if(grid[i][j]){land++;//如果遍历到土地,那么就land++if(i<gridSize-1&&grid[i+1][j])//如果土地的下方也是土地,那么broader++{broader++;}if(j<gridColSize[i]-1&&grid[i][j+1])//如果土地的右方也是土地,那么broader++{broader++;}}}}int result=4*land-2*broader;//一块土地有四条边,一个土地每接壤了一块土地,就要少两条边//所以总边数=4*土地块数-2*接壤土地块数return result;
}
题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
思路:
本题我们可以采用递归算法来实现,遍历矩阵,找到陆地后,开始递归查找当前位置的上下左右四个方向是否也为陆地。在这过程中要注意的是,每访问一块陆地后要将其更新为'0',防止重复访问,产生死循环。
Code:
class Solution {
public:void dfs(vector<vector<char>>& grid,int i,int j){int n=grid.size();int m=grid[0].size();//访问过就更新为'0'grid[i][j]='0';//继续判断上下左右四个方向是否是岛屿if(i-1>=0 && grid[i-1][j]=='1') dfs(grid,i-1,j);if(i+1<n && grid[i+1][j]=='1') dfs(grid,i+1,j);if(j-1>=0 && grid[i][j-1]=='1') dfs(grid,i,j-1);if(j+1<m && grid[i][j+1]=='1') dfs(grid,i,j+1);}int numIslands(vector<vector<char>>& grid) {int n=grid.size();int m=grid[0].size();int num=0;//记录岛屿个数//遍历矩阵for(int i=0;i<n;i++){for(int j=0;j<m;j++){//如果当前位置为陆地,也就是为'1',则找它的上下左右相连的陆地if(grid[i][j]=='1'){dfs(grid,i,j);//岛屿数量加1num++;}}}return num;}
};
题3:统计子岛屿
你两个 m x n 的二进制矩阵 grid1 和 grid2 ,它们只包含 0 (表示水域)和 1 (表示陆地)。一个 岛屿 是由 四个方向 (水平或者竖直)上相邻的 1 组成的区域。任何矩阵以外的区域都视为水域。
如果 grid2 的一个岛屿,被 grid1 的一个岛屿 完全 包含,也就是说 grid2 中该岛屿的每一个格子都被 grid1 中同一个岛屿完全包含,那么我们称 grid2 中的这个岛屿为 子岛屿 。
请你返回 grid2 中 子岛屿 的 数目 。
示例:

输入:grid1 = [[1,1,1,0,0],[0,1,1,1,1],[0,0,0,0,0],[1,0,0,0,0],[1,1,0,1,1]], grid2 = [[1,1,1,0,0],[0,0,1,1,1],[0,1,0,0,0],[1,0,1,1,0],[0,1,0,1,0]]
输出:3
解释:如上图所示,左边为 grid1 ,右边为 grid2 。
grid2 中标红的 1 区域是子岛屿,总共有 3 个子岛屿。
思路:
1.首先要明确子岛屿的定义:grid2 的一个岛屿必须被 grid1 的一个岛屿 完全 包含。
2.我们采用递归算法来实现本题
3.在写递归条件时,我们需要考虑的是,当遇到下标越界或是土地2的一个岛屿已经结束(也就是grid2[i][j]!=1)时,说明当前的这个子岛屿已经判断完毕,return true
4.每访问一个位置,就要将当前位置变成不是陆地,这里我设置成2,为了防止出现死循环,设置过之后,访问过的位置不会再次被访问
5.设置一个标记,用来标记当前是否为子岛屿
6.每次都要判断上下左右四个方向是否是陆地,且满足被包含在土地1的岛屿中
Code:
class Solution {
public://坐标的偏移量(上下左右四个方向)int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0}; bool dfs(vector<vector<int>>& grid1, vector<vector<int>>& grid2,int i,int j){int n=grid1.size();int m=grid1[0].size();//如果不是陆地,或越界,返回trueif(i>=n||i<0||j>=m||j<0||grid2[i][j]!=1) return true;//访问过的位置置为2,防止出现死循环grid2[i][j]=2;//设置标记flag,初始为truebool flag=true;//如果土地1当前位置不是陆地,则将flag置为flase,在最后统一返回,不能现在直接return,不然会导致有些岛屿没有判断到if(grid1[i][j]==0) flag=false;//开始找上下左右四个方向for(int k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];//这里flag必须两个条件相与,如果上一轮flag为false,那么说明土地1的岛屿没有完全包含土地2的岛屿,即使此时两块土地的位置都为1,也不符合题意,flag仍然为falseflag=dfs(grid1,grid2,x,y) && flag;}return flag;}int countSubIslands(vector<vector<int>>& grid1, vector<vector<int>>& grid2) {int n=grid1.size();int m=grid1[0].size();int res=0;//记录子岛屿的个数for(int i=0;i<n;i++){for(int j=0;j<m;j++){//如果当前土地2的位置是陆地,同时土地1的位置也是陆地,才能进入递归//因为我们在递归中,设置为只要不是陆地,那么当前位置就是子岛屿,所以进入递归的前提条件就是当前位置必须是陆地if(grid2[i][j]==1 && grid1[i][j]==1){if(dfs(grid1,grid2,i,j))res++;}}}return res;}
};相关文章:
关于岛屿的三道leetcode原题:岛屿周长、岛屿数量、统计子岛屿
题1:岛屿周长 给定一个 row x col 的二维网格地图 grid ,其中:gridi 1 表示陆地, gridi 0 表示水域。 网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰…...
lintcode 1081 · 贴纸拼单词【hard 递归+记忆化搜索才能通过】
题目 https://www.lintcode.com/problem/1081/ 给出N种不同类型的贴纸。 每个贴纸上都写有一个小写英文单词。 通过裁剪贴纸上的所有字母并重排序来拼出字符串target。 每种贴纸可以使用多次,假定每种贴纸数量无限。 拼出target最少需要多少张贴纸?如果…...
HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(二)
三、拖动手势(PanGesture) .PanGestureOptions(value?:{ fingers?:number; direction?:PanDirection; distance?:number}) 拖动手势用于触发拖动手势事件,滑动达到最小滑动距离(默认值为5vp)时拖动手势识别成功&am…...
计算机毕设之基于Python+django+MySQL可视化的学习系统的设计与实现
系统阐述的是使用可视化的学习系统的设计与实现,对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计,描述,实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构。利…...
Kotlin inline、noinline、crossinline 深入解析
主要内容: inline 高价函数的原理分析Non-local returns noinlinecrossinline inline 如果有C语言基础的,inline 修饰一个函数表示该函数是一个内联函数。编译时,编译器会将内联函数的函数体拷贝到调用的地方。我们先看下在一个普通的 kot…...
在 CentOS 7 / RHEL 7 上安装 Python 3.11
原文链接:https://computingforgeeks.com/install-python-3-on-centos-rhel-7/ Python 是一种高级解释性编程语言,已被用于各种应用程序开发,并在近年来获得了巨大的流行。Python 可用于编写广泛的应用程序,包括 Web 开发、数据分…...
SVN基本使用笔记——广州云科
简介 SVN是什么? 代码版本管理工具 它能记住你每次的修改 查看所有的修改记录 恢复到任何历史版本 恢复己经删除的文件 SVN跟Git比,有什么优势 使用简单,上手快 目录级权限控制,企业安全必备 子目录Checkout,减少不必要的文件检出…...
python爬虫-Selenium
一、Selenium简介 Selenium是一个用于Web应用程序测试的工具,Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。模拟浏览器功能,自动执行网页中的js代码,实现动态加载。 二、环境配置 1、查看本机电脑谷歌浏览器的版…...
flutter plugins插件【一】【FlutterJsonBeanFactory】
1、FlutterJsonBeanFactory 在Setting->Tools->FlutterJsonBeanFactory里边自定义实体类的后缀,默认是entity 复制json到粘贴板,右键自己要存放实体的目录,可以看到JsonToDartBeanAction Class Name是实体名字,会默认加上…...
系统中出现大量不可中断进程和僵尸进程(理论)
一 进程状态 当 iowait 升高时,进程很可能因为得不到硬件的响应,而长时间处于不可中断状态。从 ps 或者 top 命令的输出中,你可以发现它们都处于 D 状态,也就是不可中断状态(Uninterruptible Sleep)。 R …...
L1-012 计算指数(Python实现) 测试点全过
前言: {\color{Blue}前言:} 前言:本系列题使用的是“PTA中的团体程序设计天梯赛——练习集”的题库,难度有L1、L2、L3三个等级,分别对应团体程序设计天梯赛的三个难度,如有需要可以直接查看对应专栏。发布个…...
String、StringBuffer、StringBuilder的区别
String、StringBuffer、StringBuilder的区别 String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.StringBuffer与StringBuilder(更快)大部分功能是相似的StringBuffer采用同步处理,属于线程安全操作;而S…...
.net基础概念
1. .NET Framework .NET Framework开发平台包含公共语言运行库(CLR)和基类库(BCL),前者负载管理代码的执行,后者提供了丰富的类库来构建应用程序。.NET Framework仅支持Windows平台 2. Mono 由于.NET Framework支支持windows环境,因此社区…...
电缆工厂 3D 可视化管控系统 | 智慧工厂
近年来,我国各类器材制造业已经开始向数字化生产转型,使得生产流程变得更加精准高效。通过应用智能设备、物联网和大数据分析等技术,企业可以更好地监控生产线上的运行和质量情况,及时发现和解决问题,从而提高生产效率…...
bazel高效使用和调优
Bazel 为了正确性和高性能,做了很多优秀的设计,那么我们如何正确的使用这些能力,让我们的构建性能“起飞”呢, 我们将从本地研发和 CI pipeline 两种场景进行分析。 本地研发 本地研发通常采用默认的 Bazel 配置即可,…...
【实训项目】传道学习助手APP设计
1.设计摘要 跨入21世纪以来,伴随着时代的飞速发展,国民对教育的重视度也有了进一步的提升。我们不难发现虽然很多学习内容有学习资料或者答案,但是这些内容并不能达到让所有求学的人对所需知识进行完全地理解与掌握。所以我们需要进行提问与求助。那么一…...
短信验证码服务
使用的是 阿里云 阿里云官网 1.找到 左上角侧边栏 -云通信 -短信服务 2.在快速学习测试处 ,按照步骤完成快速学习,绑定要测试的手机号,选专用 【测试模板】,自定义模板需要人工审核,要一个工作日 3.右上角 获取 Acces…...
windows如何更改/禁用系统更新
提示:首先说明这属于将更新时间更改,不过你可以的将更新时间更改为十年一百年 废话不多说开始正文: 1.首先:winR打开运行,输入regedit,进入注册表编辑器 2.进入编辑器后依次点击:HKEY_LOCAL_MACHINE\SOFT…...
Clion 使用ffmpeg 学习1 开发环境配置
Clion 使用ffmpeg 学习1 开发环境配置 一、准备工作1. 准备环境2. 下载FFmpeg 二、操作步骤1. Clion 新建一个C项目2. 修改 CMakeLists.txt3. 修改配置4. 运行测试5. 打印rtsp 流信息的 demo 一、准备工作 在视频处理和多媒体应用程序开发中,FFmpeg 是一个强大的开…...
浏览器连不上 Flink WebUI 8081 端口
安装 flink-1.17.0 后,start-cluster.sh 启动,发现浏览器连不上 Flink WebUI 的8081端口。 问题排查: command R,输入cmd,检查宿主机能否ping通虚拟机,发现能ping通。 检查是否有flink以外的任务占用8081…...
Vivo Xplay6专用降级刷机工具AFTool|支持1.15.1/1.16.6/1.16.14等多版本线刷|含教程+驱动+工具包
温馨提示:文末有联系方式【适用机型精准说明】 本工具包专为Vivo Xplay6(型号V317A/V317K)深度适配,非Xplay6机型(含其他Vivo手机)请勿购买——不同机型Bootloader锁机制与分区结构差异极大,强行…...
STM32G4基本定时器TIM6/TIM7入门:从CubeMX配置到1秒精准中断(附代码)
STM32G4基本定时器实战:用CubeMX配置TIM6实现精准秒闪LED 第一次拿到STM32G4开发板时,最让人兴奋的莫过于让板载LED按照自己的意愿闪烁。这看似简单的需求,却是理解微控制器定时器系统的绝佳切入点。本文将带您从零开始,通过STM32…...
ESP8266轻量级按钮状态MQTT同步库
1. 项目概述BartOS-button-online是为 BartOS 物联网操作系统设计的轻量级按钮状态在线同步库,专用于资源受限的 ESP8266 平台(如 ESP-01、NodeMCU),并兼容 Arduino Core for ESP8266 开发环境。该库不提供独立的 UI 或 Web 服务&…...
从原理到实战:AEC如何成为现代通信的“静音守护者”
1. 回声:从自然现象到通信难题 想象一下,你正在和远方的朋友视频通话,突然听到自己的声音像山谷回音一样不断重复。这种恼人的现象就是我们常说的"声学回声"。在自然界中,回声是声音遇到障碍物反射形成的物理现象&#…...
MiniCPM-o-4.5-nvidia-FlagOS处理Markdown文档效果:使用Typora风格进行优雅排版
MiniCPM-o-4.5-nvidia-FlagOS处理Markdown文档效果:使用Typora风格进行优雅排版 不知道你有没有过这样的经历:辛辛苦苦写了一大堆技术笔记,代码片段、命令、思路混杂在一起,过几天自己再看,都感觉像在看天书。或者&…...
避坑指南:Java下载MinIO目录时,路径处理、空文件夹和权限的那些坑
Java与MinIO目录下载实战:从路径陷阱到权限优化的深度解析 1. 当MinIO目录下载遇上真实开发场景 在云存储时代,MinIO作为高性能的对象存储解决方案,已经成为Java开发者处理文件存储的热门选择。但当我们从简单的单文件操作转向复杂的目录下载…...
ESP32-S3的AI新玩法:除了语音唤醒,还能用TensorFlow Lite Micro做哪些酷事?(环境音识别/振动监测实战)
ESP32-S3边缘智能实战:从环境音识别到工业振动监测的AI新范式 当一颗售价不到5美元的芯片能够听懂玻璃破碎声、预测电机故障,甚至识别婴儿啼哭时,物联网设备的"感知能力"正在被重新定义。ESP32-S3搭配TensorFlow Lite Micro&#x…...
MogFace人脸检测工具保姆级教程:Streamlit状态管理实现连续检测流程
MogFace人脸检测工具保姆级教程:Streamlit状态管理实现连续检测流程 1. 项目简介与核心价值 你是不是遇到过这样的场景?团队合影需要快速统计人数,或者从一张复杂的照片里找出所有人脸的位置。传统方法要么精度不够,要么操作复杂…...
SD-WebUI Cleaner 终极指南:AI图像清理与对象移除完整教程
SD-WebUI Cleaner 终极指南:AI图像清理与对象移除完整教程 【免费下载链接】sd-webui-cleaner An extension for stable-diffusion-webui to remove any object. 项目地址: https://gitcode.com/gh_mirrors/sd/sd-webui-cleaner 你是否曾经想要从照片中移除不…...
大麦抢票神器:3步轻松实现演唱会门票自动化抢购终极指南
大麦抢票神器:3步轻松实现演唱会门票自动化抢购终极指南 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到心仪演唱会门票而烦…...
