【Leetcode】463. 岛屿的周长

一、题目描述

给定一个KaTeX parse error: Undefined control sequence: \x at position 4: row\̲x̲\col的二维网格地图 g r i d grid grid,其中: g r i d [ i ] [ j ] = 1 grid[i][j]=1 grid[i][j]=1表示陆地, g r i d [ i ] [ j ] = 0 grid[i][j]=0 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、第一次尝试

1.1 代码如下

class Solution(object):
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        self.grid = grid
        self.rows = len(grid)
        self.cols = len(grid[0]) if self.rows > 0 else 0

        if self.rows <= 100 and self.cols <= 100:
            perimeter = 0

            for i in range(self.rows):
                for j in range(self.cols):
                    if self.grid[i][j] == 1:  # 当前格子是陆地
                        # 检查上方是否为水域或网格边界
                        if i == 0 or self.grid[i - 1][j] == 0:
                            perimeter += 1
                        # 检查下方是否为水域或网格边界
                        if i == self.rows - 1 or self.grid[i + 1][j] == 0:
                            perimeter += 1
                        # 检查左侧是否为水域或网格边界
                        if j == 0 or self.grid[i][j - 1] == 0:
                            perimeter += 1
                        # 检查右侧是否为水域或网格边界
                        if j == self.cols - 1 or self.grid[i][j + 1] == 0:
                            perimeter += 1

            return perimeter

1.2 运行情况
运行用时较长,内存消耗较多,复杂度为 O ( M n ) O(Mn) O(Mn)
在这里插入图片描述

2、优化

要降低代码的复杂度,我们可以简化一些操作和避免不必要的变量存储。

改进点:

  1. 直接检查网格是否为空:通过 if not grid or not grid[0]: 提前处理空网格的情况,这样可以避免在后续计算中访问空列表。
  2. 减少不必要的变量存储:去掉了 self.grid, self.rows, self.cols 这些存储,直接在函数内部使用局部变量 grid, rows, cols
  3. 保持逻辑清晰:代码逻辑与原版本一致,但去除了多余的代码行和变量,使得代码更加紧凑和易于阅读。

2.1 代码如下

class Solution(object):
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        if not grid or not grid[0]:
            return 0
        
        rows, cols = len(grid), len(grid[0])
        perimeter = 0
 
        for i in range(rows):
            for j in range(cols):
                if grid[i][j] == 1:  # 当前格子是陆地
                    # 上边界或上方为水域
                    if i == 0 or grid[i - 1][j] == 0:
                        perimeter += 1
                    # 下边界或下方为水域
                    if i == rows - 1 or grid[i + 1][j] == 0:
                        perimeter += 1
                    # 左边界或左侧为水域
                    if j == 0 or grid[i][j - 1] == 0:
                        perimeter += 1
                    # 右边界或右侧为水域
                    if j == cols - 1 or grid[i][j + 1] == 0:
                        perimeter += 1
 
        return perimeter

2.2 运行情况
运行用时缩短,内存消耗差不多,复杂度为 O ( M n ) O(Mn) O(Mn)
在这里插入图片描述

3、第二次优化

可以转换个思路:逐行遍历方格,每行第一个陆地方格周长取4;后面若没有存在公共边,加4;存在一条公共边,减2;存在两条公共边,需减4。以示例1举例见下图。

在这里插入图片描述

3.1 代码如下

class Solution(object):
    def islandPerimeter(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        if not grid or not grid[0]:
            return 0
        
        rows, cols = len(grid), len(grid[0])
        perimeter = 0
 
        for i in range(rows):
            for j in range(cols):
                if grid[i][j] == 1:
                    perimeter += 4
                    if i - 1 >= 0 and grid[i - 1][j] == 1:
                        # 如果当前格子的上边一个格子是陆地,说明他们之间共享一条边,因此从周长中减去2
                        perimeter -= 2
                    if j - 1 >= 0 and grid[i][j - 1] == 1:
                        # 如果当前格子的左边一个格子是陆地,依然说明他们共享一条边,周长同样减少2
                        perimeter -= 2
 
        return perimeter

2.2 运行情况
运行用时缩短,内存消耗差不多,复杂度为 O ( M n ) O(Mn) O(Mn)
在这里插入图片描述
若grid恒存在,取消这段代码:

if not grid or not grid[0]:
	return 0

运行时间缩短更多:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业微信远程一直显示正在加载

企业微信远程一直显示正在加载 1.问题描述2.问题解决 系统&#xff1a;Win10 1.问题描述 某天使用企业微信给同事进行远程协助的时候&#xff0c;发现一直卡在正在加载的页面&#xff0c;如下图所示 2.问题解决 经过一番查找资料后&#xff0c;我发现可能是2个地方出了问题…

【Block总结】ODConv动态卷积,适用于CV任务|即插即用

一、论文信息 论文标题&#xff1a;Omni-Dimensional Dynamic Convolution作者&#xff1a;Chao Li, Aojun Zhou, Anbang Yao发表会议&#xff1a;ICLR 2022论文链接&#xff1a;https://arxiv.org/pdf/2209.07947GitHub链接&#xff1a;https://github.com/OSVAI/ODConv 二…

英语语法 第一天

I’m a student. 我是个学生 我是个新东方的学生 I’m a student of New Oriental School 我爱你 I love you 我在心中爱你 I love you in my heart. 这是一朵花 This is a flower 这是一朵在公园里的花 This is a flower in the park.(修饰部分在修饰词后面) 主干…

doris:高并发导入优化(Group Commit)

在高频小批量写入场景下&#xff0c;传统的导入方式存在以下问题&#xff1a; 每个导入都会创建一个独立的事务&#xff0c;都需要经过 FE 解析 SQL 和生成执行计划&#xff0c;影响整体性能每个导入都会生成一个新的版本&#xff0c;导致版本数快速增长&#xff0c;增加了后台…

智联出行公司布局中国市场,引领绿色出行新潮流

近日&#xff0c;智联共享科技有限公司&#xff08;智联出行ZSTL&#xff09;正式入驻中国香港市场&#xff0c;开启中国地区“合伙人”战略部署&#xff0c;其线上服务平台也于同日上线。 作为共享单车领域的先行者&#xff0c;智联出行公司此举标志着其全球化布局的重要进展&…

PythonFlask框架

文章目录 处理 Get 请求处理 POST 请求应用 app.route(/tpost, methods[POST]) def testp():json_data request.get_json()if json_data:username json_data.get(username)age json_data.get(age)return jsonify({username: username测试,age: age})从 flask 中导入了 Flask…

开源的瓷砖式图像板系统Pinry

简介 什么是 Pinry &#xff1f; Pinry 是一个开源的瓷砖式图像板系统&#xff0c;旨在帮助用户轻松保存、标记和分享图像、视频和网页。它提供了一种便于快速浏览的格式&#xff0c;适合喜欢整理和分享多种媒体内容的人。 主要特点 图像抓取和在线预览&#xff1a;支持从网页…

前端进阶:深度剖析预解析机制

一、预解析是什么&#xff1f; 在前端开发中&#xff0c;我们常常会遇到一些看似不符合常规逻辑的代码执行现象&#xff0c;比如为什么在变量声明之前访问它&#xff0c;得到的结果是undefined&#xff0c;而不是报错&#xff1f;为什么函数在声明之前就可以被调用&#xff1f…

stm32教程:EXTI外部中断应用

早上好啊大佬们&#xff0c;上一期我们讲了EXTI外部中断的原理以及基础代码的书写&#xff0c;这一期就来尝试一下用它来写一些有实际效能的工程吧。 这一期里&#xff0c;我用两个案例代码来让大家感受一下外部中断的作用和使用价值。 旋转编码器计数 整体思路讲解 这里&…

数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)

一、前提 二、模型评估 1.改造⑥ 2.Cross Validation算子说明 2.1Cross Validation 的作用 2.1.1 模型评估 2.1.2 减少过拟合 2.1.3 数据利用 2.2 Cross Validation 的工作原理 2.2.1 数据分割 2.2.2 迭代训练与测试 ​​​​​​​ 2.2.3 结果汇总 ​​​​​​​ …

WPS mathtype间距太大、显示不全、公式一键改格式/大小

1、间距太大 用mathtype后行距变大的原因 mathtype行距变大到底怎么解决-MathType中文网 段落设置固定值 2、显示不全 设置格式&#xff1a; 打开MathType编辑器点击菜单栏中的"格式(Format)"选择"间距(Spacing)"在弹出的对话框中调整"分数间距(F…

【Postman接口测试】Postman的安装和使用

在软件测试领域&#xff0c;接口测试是保障软件质量的关键环节之一&#xff0c;而Postman作为一款功能强大且广受欢迎的接口测试工具&#xff0c;能够帮助测试人员高效地进行接口测试工作。本文将详细介绍Postman的安装和使用方法&#xff0c;让你快速上手这款工具。 一、Pos…

因果推断与机器学习—用机器学习解决因果推断问题

Judea Pearl 将当前备受瞩目的机器学习研究戏谑地称为“仅限于曲线拟合”,然而,曲线拟合的实现绝非易事。机器学习模型在图像识别、语音识别、自然语言处理、蛋白质分子结构预测以及搜索推荐等多个领域均展现出显著的应用效果。 在因果推断任务中,在完成因果效应识别之后,需…

python算法和数据结构刷题[2]:链表、队列、栈

链表 链表的节点定义&#xff1a; class Node():def __init__(self,item,nextNone):self.itemitemself.nextNone 删除节点&#xff1a; 删除节点前的节点的next指针指向删除节点的后一个节点 添加节点&#xff1a; 单链表 class Node():"""单链表的结点&quo…

AJAX案例——图片上传个人信息操作

黑马程序员视频地址&#xff1a; AJAX-Day02-11.图片上传https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p26 图片上传 <!-- 文件选择元素 --><input type"file"…

deepseek大模型本机部署

2024年1月20日晚&#xff0c;中国DeepSeek发布了最新推理模型DeepSeek-R1&#xff0c;引发广泛关注。这款模型不仅在性能上与OpenAI的GPT-4相媲美&#xff0c;更以开源和创新训练方法&#xff0c;为AI发展带来了新的可能性。 本文讲解如何在本地部署deepseek r1模型。deepseek官…

使用 Ollama 和 Kibana 在本地为 RAG 测试 DeepSeek R1

作者&#xff1a;来自 Elastic Dave Erickson 及 Jakob Reiter 每个人都在谈论 DeepSeek R1&#xff0c;这是中国对冲基金 High-Flyer 的新大型语言模型。现在他们推出了一款功能强大、具有开放权重的思想链推理 LLM&#xff0c;这则新闻充满了对行业意味着什么的猜测。对于那些…

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…

栈和队列特别篇:栈和队列的经典算法问题

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 数据结构:队列篇 文章目录 系列文章目录前言一.有效的括号(leetcode 20)二.用队列实现栈(leetcode…

记录一次,PyQT的报错,多线程Udp失效,使用工具如netstat来检查端口使用情况。

1.问题 报错Exception in thread Thread-1: Traceback (most recent call last): File "threading.py", line 932, in _bootstrap_inner File "threading.py", line 870, in run File "main.py", line 456, in udp_recv IndexError: list…