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

2023-11-22 08:36

本文主要是介绍力扣第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; // 返回计算得到的岛屿周长}
}

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

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

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

这篇关于力扣第463题 岛屿的周长 C++ 深度优先搜索 + 思维判断的边界的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/408874

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数