【leetcode100】岛屿的周长

news/2025/2/8 19:15:29 标签: 算法, python, leetcode

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 1
            if grid[r][l]==0:
                return 1
            if grid[r][l] != 1:
                return 0
            grid[r][l] = 2
            return (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 = 0
        near = 0
        m, n = len(grid), len(grid[0])
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1:
                    land += 1
                    if j+1 < n and grid[i][j+1] == 1:
                        near += 1
                    if i+1 < m and grid[i+1][j] == 1:
                        near += 1
        return 4*land - 2*near

http://www.niftyadmin.cn/n/5845225.html

相关文章

Docker Desktop安装kubernetes时一直在Starting:Kubernetes failed to start

原因&#xff1a;由于墙的问题&#xff0c;导致拉取国外的K8s镜像失败 解决&#xff1a; 下载 k8s-for-docker-desktop 选中自己的kubernetes 版本 下载zip包 PowerShell运行load_images.ps1文件 重启docker kubernetes运行成功

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…

springboot项目的单元测试

文章目录 依赖编写单测代码一些注意点 依赖 依赖包含了 JUnit、Mockito、Spring Test 等常用的测试工具 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><…

安卓/ios脚本开发按键精灵经验小分享

1. 程序的切换 我们经常碰到这样的需求&#xff1a;打开最近的应用列表&#xff0c;选取我们想要的程序。但是每个手机为了自己的风格&#xff0c;样式都有区别&#xff0c;甚至连列表的滑动方向都不一样&#xff0c;我们很难通过模拟操作来识别点击&#xff0c;那么我们做的只…

Java 线程池:7参数配置、4拒绝策略与执行流程详解

1. 为什么需要线程池&#xff1f; 在 Java 并发编程中&#xff0c;线程的创建和销毁是一项昂贵的操作。频繁地创建和销毁线程会带来较高的系统开销&#xff0c;甚至可能因线程数过多而导致 OOM&#xff08;OutOfMemoryError&#xff09; 或 CPU 过载。 线程池&#xff08;Thre…

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 进程组 进程组的概念 当我们使用以下命令查与…

C#冒泡排序,选择排序

冒泡排序 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。这个过程一直进行&#xff0c;直到没有需要交换的元素为止&#xff0c;这时数列就排序完成了。这种算法的名字来源…

kafka消费端之消费者协调器和组协调器

文章目录 概述回顾历史老版本获取消费者变更老版本存在的问题 消费者协调器和组协调器新版如何解决老版本问题再均衡过程**第一阶段CFIND COORDINATOR****第二阶段&#xff08;JOINGROUP&#xff09;**选举消费组的lcader选举分区分配策略 第三阶段&#xff08;SYNC GROUP&…