LeetCode 463. 岛屿的周长

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 463. 岛屿的周长相关的知识,希望对你有一定的参考价值。


​463. 岛屿的周长​

给定一个 ​​row x col​​​ 的二维网格地图 ​​grid​​​ ,其中:​​grid[i][j] = 1​​​ 表示陆地, ​​grid[i][j] = 0​​ 表示水域。

网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

示例 1:

LeetCode

输入: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​

你设计的解决方案必须不修改数组 ​​nums​​​ 且只用常量级 ​​O(1)​​ 的额外空间。

示例 1:

输入:nums = [1,3,4,2,2]
输出:2

示例 2:

输入:nums = [3,1,3,4,2]
输出:3

示例 3:

输入:nums = [1,1]
输出:1

示例 4:

输入:nums = [1,1,2]
输出:1

提示:

  • ​1 <= n <= 105​
  • ​nums.length == n + 1​
  • ​1 <= nums[i] <= n​
  • ​nums​​ 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次

进阶:

  • 如何证明 ​​nums​​ 中至少存在一个重复的数字?
  • 你可以设计一个线性级时间复杂度 ​​O(n)​​ 的解决方案吗?

二、方法一

深度优先搜索

class Solution 
public int islandPerimeter(int[][] grid)
for (int i = 0; i < grid.length; i++)
for (int j = 0; j < grid[i].length; j++)
if (grid[i][j] == 1)
return dfs(grid, i, j);



return 0;

public int dfs(int[][] grid, int r, int c)
if (!(r >= 0 && r < grid.length && c >= 0 && c < grid[r].length))
return 1;

if (grid[r][c] == 0)
return 1;

if (grid[r][c] != 1)
return 0;

grid[r][c] = 2;
return dfs(grid, r + 1, c) +
dfs(grid, r - 1, c) +
dfs(grid, r, c + 1) +
dfs(grid, r, c - 1);

复杂度分析

  • 时间复杂度:O(nm),其中 n 为网格的高度,m 为网格的宽度。每个格子至多会被遍历一次,因此总时间复杂度为 O(nm)。
  • 空间复杂度:O(nm)。深度优先搜索复杂度取决于递归的栈空间,而栈空间最坏情况下会达到 O(nm)。


以上是关于LeetCode 463. 岛屿的周长的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 463. 岛屿的周长

LeetCode 463. 岛屿的周长 bfs

LeetCode 463 岛屿的周长

463 Island Perimeter 岛屿的周长

LeetCode 0463. 岛屿的周长

岛屿问题(岛数量/孤岛/面积/周长)