news 2026/4/15 20:22:10

LeetCode 463 - 岛屿的周长

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 463 - 岛屿的周长


文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
      • 为什么每块陆地是 4 条边?
      • 为什么相邻就要减边?
      • 这样会不会重复计算?
    • Swift 可运行 Demo 代码
    • 代码逐步解析
      • 为什么不担心越界?
    • 示例测试及结果
    • 与实际场景结合
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

这道题乍一看是个“地图题”,很多人第一反应可能是 DFS / BFS,甚至想去模拟整条边界走一圈。但其实这是一道非常典型的“把问题拆小”的题

你根本不需要真的去“绕岛一周”,只要站在每一块陆地的角度,问一句话就够了:

我这块地,有几条边是暴露在水里的?

把这个问题想清楚,代码会非常简单,而且几乎不可能写错。

描述

题目给你一个二维网格grid

  • 1表示陆地
  • 0表示水域

已知条件非常友好:

  • 整个地图被水包围
  • 只有一个岛屿
  • 岛屿内部没有湖(也就是说,水不会被陆地完全包住)
  • 相邻只考虑上下左右,不考虑对角线

每一个格子都是边长为 1 的正方形,你需要计算:

这个岛屿的总周长

题解答案

这道题最清晰、最不容易出 bug 的解法可以用一句话概括:

每一块陆地默认贡献 4 条边,每和另一块陆地相邻一次,就少 1 条边。

换句话说:

  • 遍历整个网格

  • 遇到一块陆地

    • 先加 4
    • 看它的上下左右
    • 每发现一个相邻的陆地,就减 1

最后所有陆地的贡献加起来,就是岛屿的周长。

题解代码分析

为什么每块陆地是 4 条边?

这个很直观:

  • 一个正方形,本来就是 4 条边
  • 如果它四周全是水,那这 4 条边全都算周长

为什么相邻就要减边?

当两块陆地挨在一起时,比如左右相邻:

[1][1]

它们中间那条边,其实是“内部边”,不属于周长

而且要注意一个细节:

  • 对于当前这块地来说
  • 只要有一个方向是陆地
  • 那个方向就不能算周长

所以:

  • 每发现一个相邻陆地
  • 当前格子的周长贡献就要-1

这样会不会重复计算?

不会。

因为我们是站在每一块陆地的角度算自己的边,不是在算“边本身”。
每一条真正的外边,只会被某一块陆地算一次。

Swift 可运行 Demo 代码

importFoundationclassSolution{funcislandPerimeter(_grid:[[Int]])->Int{letrows=grid.countletcols=grid[0].countvarperimeter=0foriin0..<rows{forjin0..<cols{ifgrid[i][j]==1{// 每块陆地默认 4 条边perimeter+=4// 上ifi>0&&grid[i-1][j]==1{perimeter-=1}// 下ifi<rows-1&&grid[i+1][j]==1{perimeter-=1}// 左ifj>0&&grid[i][j-1]==1{perimeter-=1}// 右ifj<cols-1&&grid[i][j+1]==1{perimeter-=1}}}}returnperimeter}}

代码逐步解析

ifgrid[i][j]==1{perimeter+=4}

只要是陆地,先把 4 条边加上,这是“理论最大值”。

ifi>0&&grid[i-1][j]==1{perimeter-=1}

检查上方是否是陆地:

  • 如果是,说明上边不是周长
  • 减 1

上下左右四个方向完全一样的逻辑。

为什么不担心越界?

每次检查前都先判断:

  • i > 0
  • i < rows - 1
  • j > 0
  • j < cols - 1

这也是写网格题时非常重要的一个习惯。

示例测试及结果

letsolution=Solution()letgrid1=[[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]print(solution.islandPerimeter(grid1))// 16letgrid2=[[1]]print(solution.islandPerimeter(grid2))// 4letgrid3=[[1,0]]print(solution.islandPerimeter(grid3))// 4

输出结果:

16 4 4

和题目给出的示例完全一致。

与实际场景结合

这道题在真实工程里,其实有不少“换皮版本”。

比如:

  1. 地图渲染

    • 计算某一片区域的边界长度
  2. 图像处理

    • 统计连通区域的轮廓像素
  3. 游戏开发

    • 判断地形边缘,用来画描边或碰撞边界
  4. 数据分析

    • 计算某个连通块的“外部复杂度”

它们的共同点都是:

不关心内部结构,只关心“暴露在外面的边”。

时间复杂度

O(row * col)

每个格子只访问一次,每次最多检查 4 个方向。

空间复杂度

O(1)

只用了几个计数变量,没有额外的数据结构。

总结

这道题非常适合用来训练一个能力:

把“整体问题”拆成“局部贡献”的能力

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 0:29:19

2025必备!10个一键生成论文工具,专科生轻松搞定毕业论文!

2025必备&#xff01;10个一键生成论文工具&#xff0c;专科生轻松搞定毕业论文&#xff01; AI 工具如何让论文写作更高效&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的专科生开始借助 AI 工具来辅助毕业论文的撰写。这些工具不仅能够帮助学生节省大量时间…

作者头像 李华
网站建设 2026/4/15 17:52:05

linux 进程和线程的本质区别是什么

在Linux系统中&#xff0c;进程与线程的本质区别体现在资源分配、调度机制、上下文切换成本、通信方式及安全性等多个维度&#xff0c;具体分析如下&#xff1a; 1. 资源分配与隔离性 进程&#xff1a;是操作系统资源分配的基本单位&#xff0c;拥有独立的地址空间、内存、文…

作者头像 李华
网站建设 2026/4/11 2:02:39

1.3 Kubernetes核心概念详解:掌握本地集群配置与应用部署秘诀

1.3 Kubernetes核心概念详解:掌握本地集群配置与应用部署秘诀 Kubernetes(简称K8s)是当前最流行的容器编排平台,它为容器化应用提供了部署、扩展和管理的完整解决方案。本文将深入解析Kubernetes的核心概念,带你从零开始搭建本地集群,并掌握应用部署的关键技巧。 Kuber…

作者头像 李华
网站建设 2026/4/12 11:19:52

3.3 LLM检索增强生成(RAG)技术入门:打造专属智能运维知识库

3.3 LLM检索增强生成(RAG)技术入门:打造专属智能运维知识库 在AIOps领域,虽然大语言模型(LLM)具有强大的通用知识和语言理解能力,但在处理企业特定的运维场景时,往往需要结合企业内部的专有知识。检索增强生成(Retrieval-Augmented Generation, RAG)技术应运而生,它通…

作者头像 李华
网站建设 2026/4/13 10:47:29

Transformer搞定康复动作识别,效率翻倍

&#x1f4dd; 博客主页&#xff1a;Jax的CSDN主页 Transformer赋能康复动作识别&#xff1a;实时精准评估&#xff0c;效率提升两倍目录Transformer赋能康复动作识别&#xff1a;实时精准评估&#xff0c;效率提升两倍 引言&#xff1a;康复医学的效率瓶颈与技术破局 一、技术…

作者头像 李华