【leetcode100】岛屿的周长

ops/2025/2/8 17:27:49/

1、题目描述

给定一个 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、初始思路

2.1 思路

参考【leetcode100】岛屿数量-CSDN博客中对dfs的描述,如图所示,1-5为与边界相连的周长,6-16为与海水相连的边,因此当dfs返回结果为边界或者海水时,周长加1,当返回结果为陆地时,对周长没有影响。

2.2 完整代码

class Solution:def islandPerimeter(self, grid: List[List[int]]) -> int:m, n = len(grid),len(grid[0])def dfs(r, l):if r<0 or l <0 or r>=m or l>=n:return 1if grid[r][l]==0:return 1if grid[r][l] != 1:return 0grid[r][l] = 2return (dfs(r+1, l) + dfs(r-1, l) + dfs(r, l+1) + dfs(r, l-1))for i in range(m):for j in range(n):if grid[i][j] == 1:return dfs(i,j)

3 优化算法

3.1 思路

已知只存在一个岛屿,因此可以使用更简单的数学方法进行求解,即一个陆地格子land的周长为4,如果其存在相邻的陆地格子,则可定义其相邻的边为near,此时两个格子的周长应为land*2-1*near。根据上述公式,可得整个岛屿的周长可表示为:陆地的数量*4-相邻边的数量*2,即:

c = land*4-near*2

3.2 完整代码

class Solution:def islandPerimeter(self, grid: List[List[int]]) -> int:land = 0near = 0m, n = len(grid), len(grid[0])for i in range(m):for j in range(n):if grid[i][j] == 1:land += 1if j+1 < n and grid[i][j+1] == 1:near += 1if i+1 < m and grid[i+1][j] == 1:near += 1return 4*land - 2*near

http://www.ppmy.cn/ops/156768.html

相关文章

【ArcGIS Pro简介2】

ArcGIS Pro是由Esri公司开发的一款专业地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;用于创建、管理、分析和可视化地理空间数据。以下是关于ArcGIS Pro的详细介绍&#xff1a; 一、主要特点 现代化界面&#xff1a;ArcGIS Pro采用现代化的Ribbon界面&#xff0…

尚硅谷 vue3+TS 课程笔记

1. Vue3简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Release v3.0.0 One Piece vuejs/core 截止2023年10月&#xff0c;最…

免费windows pdf编辑工具Epdf

Epdf&#xff08;完全免费&#xff09; 作者&#xff1a;不染心 时间&#xff1a;2025/2/6 Github: https://github.com/dog-tired/Epdf Epdf Epdf 是一款使用 Rust 编写的 PDF 编辑器&#xff0c;目前仍在开发中。它提供了一系列实用的命令行选项&#xff0c;方便用户对 PDF …

基于RTOS的STM32游戏机

1.游戏机的主要功能 所有游戏都来着B站JL单片机博主开源 这款游戏机具备存档与继续游戏功能&#xff0c;允许玩家在任何时候退出当前游戏并保存进度&#xff0c;以便日后随时并继续之前的冒险。不仅如此&#xff0c;游戏机还支持多任务处理&#xff0c;玩家可以在退出当前游戏…

c++ template-3

第 7 章 按值传递还是按引用传递 从一开始&#xff0c;C就提供了按值传递&#xff08;call-by-value&#xff09;和按引用传递&#xff08;call-by-reference&#xff09;两种参数传递方式&#xff0c;但是具体该怎么选择&#xff0c;有时并不容易确定&#xff1a;通常对复杂类…

小程序:如何暂时停用小程序?

一、点击左下角小程序的名称&#xff0c;》账号设置。 二、进入后点击“暂停服务”

CSS盒子模型详解

目录 一、盒子模型的组成部分 二、盒子模型的属性设置 三、盒子模型的用法示例 四、盒子模型的圆角边框 1. 语法&#xff1a; 2. 示例&#xff1a; &#xff08;1&#xff09;统一设置所有角的半径 &#xff08;2&#xff09;分别设置每个角的半径 &#xff08;3&#…

【号码分离】从Excel表格、文本、word文档混乱文字中提取分离11位手机号出来,基于WPF的实现方案

应用场景 在市场调研过程中&#xff0c;可能会收集到大量的 Excel 表格、文本报告或 Word 文档&#xff0c;其中包含客户的联系方式。通过提取手机号&#xff0c;可以方便后续的市场推广和客户跟进。 当从不同渠道收集到的数据中包含混乱的文字信息时&#xff0c;需要从中提取…