【LeetCode 深度优先搜索专项】不同岛屿的数量 II(711)

本文探讨了一种解决LeetCode问题的解法,通过深度优先搜索和岛屿形状变换,计算二维矩阵中不同岛屿的数量,包括旋转、翻转和归一化操作。关键在于理解岛屿的旋转、翻转规则,并使用哈希技术区分相同形状的岛屿。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目

给定一个 m × n m \times n m×n 的二维矩阵 grid ,使用或上、或下、或左、或右方向上相接的一组 1 1 1 代表一个岛屿。可以假定矩阵以外的区域都是海水。

如果两个岛屿之间形状相同,或者旋转(旋转角度仅可以为 90 90 90 180 180 180 270 270 270 度)之后形状相同,或者镜像(可以沿上下或左右镜像)之后形状相同,就称这两个岛屿是相同的。

要求返回给定 grid 中包含的不同岛屿数量。

1.1 示例

  • 示例 1 1 1

    • 输入: grid = [[1, 1, 0, 0, 0], [1, 0, 0, 0, 0], [0, 0, 0, 0, 1], [0, 0, 0, 1, 1]]
    • 输出: 1 1 1
    • 解释:如下图所示,将左上角的岛屿顺时针旋转 180 180 180 度之后将得到和右下角完全相同的岛屿。

在这里插入图片描述

  • 示例 2 2 2

    • 输入: grid = [[1, 1, 0, 0, 0], [1, 1, 0, 0, 0], [0, 0, 0, 1, 1], [0, 0, 0, 1, 1]]
    • 输出: 1 1 1

在这里插入图片描述

1.2 说明

1.3 提示

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • grid[i][j] 仅可为 0 0 0 或者 1 1 1

1.4 进阶

你可以使用多种方法求解该问题么?

2. 解法一(深度优先搜索)

2.1 分析

作者:LeetCode

这道题是【LeetCode 深度优先搜索专项】不同岛屿的数量(694)的加强版,不同的是这道题规定两个岛屿仅通过平移,旋转和翻转能够重合,它们的形状就相同。

解决本题的大致思路为:首先找出每个岛屿,随后将它进行旋转和翻转操作得到各种不同的情况,接着对这些情况分别进行归一化处理,然后对归一化结果进行哈希得到具有唯一性的签名,最终所有岛屿经所有变换并归一化且哈希后得到的不同签名数量就是满足要求的不同岛屿数量。

作者: jason-2

首先,为了模拟岛屿的旋转和翻转变换,可以先将岛屿的每块陆地坐标 ( x ,   y ) (x,\textit{ }y) (x, y) 都看作向量,然后利用解析几何的知识先计算出每个向量变换后的结果,最终所有通过相同变换后的向量就自然地组成了对应岛屿经相应变换后得到的结果。具体地:

  • 由于向量 ( x ,   y ) (x,\textit{ }y) (x, y) 和其旋转 90 90 90 度和 270 270 270 度的得到的向量相互正交,因此二者内积为 0 0 0 ,所以:
    • 向量 ( x ,   y ) (x,\textit{ }y) (x, y) 旋转 90 90 90 度和 270 270 270 度的向量分别为 ( y ,   − x ) (y,\textit{ }-x) (y, x) ( − y ,   x ) (-y,\textit{ }x) (y, x)
  • 向量 ( x ,   y ) (x,\textit{ }y) (x, y) 旋转 180 180 180 度: 取反向量 ( − x ,   − y ) (-x,\textit{ }-y) (x, y) 即可;
  • 向量 ( x ,   y ) (x,\textit{ }y) (x, y) 左右翻转: x x x 取反即可,即得到 ( − x ,   y ) (-x,\textit{ }y) (x, y)
  • 向量 ( x ,   y ) (x,\textit{ }y) (x, y) 上下翻转: y y y 取反即可,即得到 ( x ,   − y ) (x,\textit{ }-y) (x, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值