力扣第463题 岛屿的周长 C++ 深度优先搜索 + 思维判断的边界

题目

463. 岛屿的周长

简单

相关标签

深度优先搜索   广度优先搜索 数组 矩阵

给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

示例 1:

输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
输出:16
解释:它的周长是上面图片中的 16 个黄色的边

示例 2:

输入:grid = [[1]]
输出:4

示例 3:

输入:grid = [[1,0]]
输出:4

提示:

  • row == grid.length
  • col == grid[i].length
  • 1 <= row, col <= 100
  • grid[i][j] 为 0 或 1

思路和解题方法

  1. 定义方向数组:在类的开头,定义了一个大小为4x2的二维数组direction。该数组中存储了四个方向的偏移量,用于表示上、下、左、右四个方向。

  2. islandPerimeter函数:这是计算岛屿周长的主要函数。它接受一个二维网格作为输入,并返回岛屿的周长。

  3. 嵌套循环遍历网格:通过两个嵌套循环,遍历整个二维网格。外层循环迭代行,内层循环迭代列。

  4. 检查陆地格子:如果当前格子是陆地(grid[i][j] == 1),则进入下一步计算周长的操作。

  5. 遍历四个方向:对于每个陆地格子,使用一个循环遍历四个方向。通过对方向数组进行迭代,分别计算出当前格子上、下、左、右四个方向的相邻格子的坐标。

  6. 判断边界条件:对于每个相邻格子的坐标(x, y),判断是否满足以下条件之一:

    • x<0 或 x>=grid.size() 或 y<0 或 y>=grid[0].size():相邻格子超出了网格边界,即该方向对应的边界算作岛屿的边界。
    • grid[x][y] == 0:相邻格子是水域,即该方向对应的边界算作岛屿的边界。
  7. 计算周长:对于每个满足边界条件的方向,将周长ans加一。

  8. 返回结果:返回最终计算得到的岛屿周长ans。

复杂度

        时间复杂度:

                O(m*n)

时间复杂度为O(m*n),其中m是二维网格的行数,n是二维网格的列数。因为代码中使用了两层嵌套循环来遍历整个二维网格。

        空间复杂度

                O(1)

空间复杂度为O(1),因为除了定义了一个常量大小的二维数组来表示四个方向的偏移量之外,没有使用额外的空间。

c++ 代码

class Solution {
public:int direction[4][2] =  {0,1,1,0,-1,0,0,-1}; // 定义一个二维数组表示四个方向的偏移量int islandPerimeter(vector<vector<int>>& grid) {int ans= 0; // 初始化周长计数器为 0for(int i= 0;i<grid.size();i++) // 遍历二维网格的行{for(int j= 0 ;j<grid[0].size();j++) // 遍历二维网格的列{if(grid[i][j] == 1) // 如果当前格子是陆地(即值为 1){for(int k = 0;k<4;k++) // 遍历四个方向{int x= i+direction[k][0] ; // 计算相邻格子的行坐标int y = j+direction[k][1]; // 计算相邻格子的列坐标if(x<0||x>=grid.size()||y<0||y>=grid[0].size()||grid[x][y] == 0){ans++; // 如果相邻格子是水域或者超出边界,则将周长加 1}}}}}return ans; // 返回计算得到的总周长}
};

附Java代码

class Solution {// 定义方向数组,分别表示向右、向下、向左、向上移动的偏移量static int[] dx = {0, 1, 0, -1};static int[] dy = {1, 0, -1, 0};public int islandPerimeter(int[][] grid) {int n = grid.length; // 获取二维网格的行数int m = grid[0].length; // 获取二维网格的列数int ans = 0; // 初始化岛屿周长为0for (int i = 0; i < n; ++i) { // 遍历二维网格的每一行for (int j = 0; j < m; ++j) { // 遍历二维网格的每一列if (grid[i][j] == 1) { // 如果当前格子是陆地int cnt = 0; // 初始化当前格子的周长计数为0for (int k = 0; k < 4; ++k) { // 遍历当前格子的上下左右四个方向int tx = i + dx[k]; // 计算相邻格子的行坐标int ty = j + dy[k]; // 计算相邻格子的列坐标// 判断相邻格子是否超出网格边界或者是水域,如果是则周长加1if (tx < 0 || tx >= n || ty < 0 || ty >= m || grid[tx][ty] == 0) {cnt += 1;}}ans += cnt; // 将当前格子的周长计数累加到总周长中}}}return ans; // 返回计算得到的岛屿周长}
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

Gem5系统仿真模拟器之创建gem5——翻译自官网

文章目录 安装并使用gem5 模拟器支持的操作系统和环境依赖在 Ubuntu 22.04 启动(gem5 > v21.1)Docker获取代码用 SCons 构建用法首次构建 gem5gem5 二进制类型调试opt快速 常见错误错误的 gcc 版本Python 位于非默认位置未安装 M4 宏处理器Protobuf 3.12.3 问题 安装并使用g…

OpenAI宫斗大戏,奥特曼面临的选择

首先不得不说&#xff0c;这件事情进展真快&#xff0c;三四天时间之内&#xff0c;大量的消息&#xff0c;各种不同渠道的&#xff0c;各种不同角度的&#xff0c;其中也包括各种决策&#xff0c;速度之快真的是应接不暇&#xff0c;仿佛在看真人秀一般 这里简单帮大家梳理一…

2021秋招-面经

面经总结 微软STCA面试-面经 字节AI lab实习面试记录 腾讯PCG-腾讯新闻面试 百度(AIDU)-内容策略部门面试 百度(AIDU)-搜索策略-机器学习算法工程师 百度(AIDU)-知识图谱部门算法工程师(2020-07-08) 百度(AIDU)-NLP部门算法工程师(2020-07-10) 微软STCA面试-面经 2020-…

Docker 单节点部署 Consul

Docker 单节点部署Consul 1 Docker 拉取 Consul 镜像2 Docker 创建 Consul 容器3 启动 Consul 容器 CAP 原则是由计算机科学家 Eric Brewer 提出的&#xff0c;用于描述分布式系统中的一致性、可用性和分区容忍性之间的权衡关系&#xff0c;CAP 是三个概念的首字母缩写。 原则…

数独·12中解法·anroid 数独小游戏·休闲益智小游戏

标题数独12中解法anroid 数独小游戏休闲益智小游戏&#xff08;继续更新中……&#xff09; 一款经典数独训练app 资源下载 &#xff08;0积分&#xff09;https://download.csdn.net/download/qq_38355313/88544810 —— —— 数独&#xff08;sh d&#xff09;是源自18世纪…

【C++】泛型编程 ⑪ ( 类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 )

文章目录 一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中1、分离代码 后的 友元函数报错信息 - 错误示例Student.h 头文件内容Student.cpp 代码文件内容Test.cpp 代码文件内容执行报错信息 2、问题分析 二、代码示例 - 函数实现 写在类外部的不…

vue2.0中使用v-if/v-show切换后echarts不显示和宽高问题

vue2.0中使用v-if/v-show切换后echarts不显示和宽高问题 需求描述问题描述问题解析 解决方案使用v-show替代&#xff08;不推荐&#xff09;v-if使用$nextTick&#xff08;推荐&#xff09; 需求描述 使用ehcarts时&#xff0c;请求数据时加loading,请求结束后取消loading并显示…

redis之高可用

&#xff08;一&#xff09;redis之高可用 1、在集群当中有一个非常重要的指标&#xff0c;提供正常服务的时间的百分比&#xff08;365天&#xff09;99.9% 2、redis的高可用的含义更加广泛&#xff0c;正常服务是指标之一&#xff0c;数据容量的扩展、数据的安全性 3、在r…

存储日志数据并满足安全要求

日志数据是包含有关网络中发生的事件的记录的重要信息&#xff0c;日志数据对于监控网络和了解网络活动、用户操作及其动机至关重要。 由于网络中的每个设备都会生成日志&#xff0c;因此收集的数据量巨大&#xff0c;管理和存储所有这些数据成为一项挑战&#xff0c;日志归档…

【C语言】数据结构——栈和队列实例探究

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;一、 栈1. 栈的概念及结构2. 栈的实现3. 实现代码3.1 定义结构体3.2 初始化栈3.3 销毁栈3.4 入栈3.5 出栈…

【Java 进阶篇】深入理解 Jackson:Java 对象转 JSON 的艺术

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇关于 Jackson JSON 解析器中 Java 对象转 JSON 的详细解析指南。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;而 Jackson 作为一个强大的 JSON 解析库&#xff0c;能够帮…

基于SVM的车牌识别算法

基于SVM的车牌识别系统&#xff08;Python代码实现&#xff09; 车牌识别系统是智能交通系统的重要组成部分&#xff0c;有着广泛的应用。车牌识别系统主要有车牌定位、字符分割和字符识别三部分组成&#xff0c;本文的研究重点是车牌字符识别这部分&#xff0c;本文提出了一种…

RT-Thread Hoist_Motor PID

本节介绍的是一个举升电机&#xff0c;顾名思义&#xff0c;通过转轴控制物体升降&#xff0c;为双通道磁性译码器&#xff0c;利用电调进行操控&#xff0c;具体驱动类似于大学期间最大众的SG180舵机&#xff0c;在一定的频率下&#xff0c;通过调制脉宽进行控制。 设备介绍…

数据结构 图

树是无环连通图&#xff0c;是一种特殊的图。 分类 图分为有向图[边是有方向的]和无向图[边是无方向的]。 无向图(a—b)&#xff0c;建立两条有向图(a—>b&#xff0c;b—>a)&#xff0c;无向图是一种特殊的有向图。 存储有向图 邻接矩阵 ——用于存储比较稠密的图【…

MyBatis的xml实现

1.下载插件MyBatisX 2.添加依赖 <!--Mybatis 依赖包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><!--…

Rust错误处理机制:优雅地管理错误

大家好&#xff01;我是lincyang。 今天&#xff0c;我们要探讨的是Rust语言中的错误处理机制。 Rust作为一种系统编程语言&#xff0c;对错误处理的重视程度是非常高的。它提供了一套既安全又灵活的机制来处理可能出现的错误。 Rust错误处理的两大类别 在Rust中&#xff0…

vue下载xlsx表格

vue下载xlsx表格 // 导入依赖库 import XLSX from xlsx; import FileSaver from file-saver; methods:{btn(){let date new Date()let Y date.getFullYear() -let M (date.getMonth() 1 < 10 ? 0 (date.getMonth() 1) : date.getMonth() 1) -let D (date.getDat…

【设备树添加节点】

节点结束位置都需要加分号 of_iomap 完成映射 of_property_read_u32_array of_property_read_string of_fine_node_by_path

如何优雅的避免空指针异常

文章目录 1.数据准备2.实战&#xff1a;获取用户所在的城市2.1.直接获取&#xff1b;容易出现空指针异常。2.2.使用if-else判断&#xff1b;避免了出现空指针的问题&#xff0c;但是代码结构层次嵌套多&#xff0c;不美观2.3.使用工具类美化一下if判断代码2.4.使用Optional解决…

MySQL数据库:开源且强大的关系型数据库管理系统

大家好&#xff0c;我是咕噜-凯撒&#xff0c;数据在当今信息化时代的重要性不可忽视。作为企业和组织的重要资产&#xff0c;数据的管理和存储变得至关重要&#xff0c;MySQL作为一种关系型数据库管理系统&#xff0c;具有非常多的优势&#xff0c;下面简单的探讨一下MySQL数据…