题目地址:https://leetcode-cn.com/problems/number-of-distinct-islands/

题目描述

Given a non-empty 2D array grid of 0’s and 1’s, an island is a group of 1’s (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.

Count the number of distinct islands. An island is considered to be the same as another if and only if one island can be translated (and not rotated or reflected) to equal the other.

Example 1:

11000
11000
00011
00011
Given the above grid map, return 1.

Example 2:

11011
10000
00001
11011
Given the above grid map, return 3.

Notice that:

11
1

and

 1
11

are considered different island shapes, because we do not consider reflection / rotation.

Note: The length of each dimension in the given grid does not exceed 50.

题目大意

找出形状不同的岛屿数目。

解题方法

DFS

这个题如果是问岛屿的数量,那么可以直接使用单纯的DFS解决。但是难点在于考察不同的岛屿。

为了保存每个岛屿的形状,我们使用了vector path,里面存放的是以进入dfs的坐标为起点,把四联通的每个1转化成相对坐标,并且hash运算,保存dfs的路径。只要dfs的查找方式是固定的,那么路径就是一样的,从而得到的小岛的形状也是固定的。

在dfs的搜索中,一边搜索一边把搜索过的位置全部至0,这是个小窍门,即设置已经走过的位置不可用,从而达到防止重复走的问题。

求相对形状:把每个岛的左上角当作是 (0, 0),例如,如果一个岛是由 [(2, 3), (2, 4), (3, 4)] 构成,当固定左上角时,我们可以把这个形状看作是 [(0, 0), (0, 1), (1, 1)]。

C++中可以使用set对vector去重,但是unordered_set是不可以的。

C++代码如下:

class Solution {
public:
int numDistinctIslands(vector<vector<int>>& grid) {
if (!grid.size() || !grid[0].size()) return 0;
M = grid.size();
N = grid[0].size();
set<vector<int>> s;
for (int i = 0; i < M; ++i) {
for (int j = 0; j < N; ++j) {
if (grid[i][j] == 1) {
vector<int> path;
dfs(grid, path, i, j, i, j);
if (!path.empty()) {
s.insert(path);
}
}
}
}
return s.size();
}
void dfs(vector<vector<int>>& grid, vector<int>& path, int sr, int sc, int r, int c) {
if (r < 0 || r >= M || c < 0 || c >= N || grid[r][c] == 0) return;
path.push_back((r - sr) * N + c - sc);
grid[r][c] = 0;
dfs(grid, path, sr, sc, r - 1, c);
dfs(grid, path, sr, sc, r + 1, c);
dfs(grid, path, sr, sc, r, c - 1);
dfs(grid, path, sr, sc, r, c + 1);
}
private:
int M = 0;
int N = 0;
};

参考资料:https://leetcode-cn.com/problems/number-of-distinct-islands/solution/dfszhao-dao-yu-settong-ji-bu-tong-xing-zhuang-dao-/

日期

2019 年 9 月 21 日 —— 莫生气,我若气病谁如意

【LeetCode】694. Number of Distinct Islands 解题报告 (C++)的更多相关文章

  1. [LeetCode] 694. Number of Distinct Islands 不同岛屿的个数

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  2. [leetcode]694. Number of Distinct Islands你究竟有几个异小岛?

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  3. [LeetCode] 694. Number of Distinct Islands

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  4. [LeetCode] 711. Number of Distinct Islands II_hard tag: DFS

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  5. leetcode 200. Number of Islands 、694 Number of Distinct Islands 、695. Max Area of Island 、130. Surrounded Regions

    两种方式处理已经访问过的节点:一种是用visited存储已经访问过的1:另一种是通过改变原始数值的值,比如将1改成-1,这样小于等于0的都会停止. Number of Islands 用了第一种方式, ...

  6. [LeetCode] 711. Number of Distinct Islands II 不同岛屿的个数之二

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  7. 694. Number of Distinct Islands 形状不同的岛屿数量

    [抄题]: Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land ...

  8. [LeetCode] Number of Distinct Islands 不同岛屿的个数

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  9. [LeetCode] Number of Distinct Islands II 不同岛屿的个数之二

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

随机推荐

  1. [Linux] Miniconda安装及其使用

    集群环境下安装conda进行软件管理.Miniconda是Anaconda的简化版,对于一般需求而言就够用了.因此,我这里安装Minconda3进行软件安装管理. 安装 Miniconda下载地址,版 ...

  2. 搭建FastDFS集群

    先插一张图(学习的时候找的)http://blog.csdn.net/u012453843/article/details/68957209?> 软件下载地址:主要是fastdfs.libfas ...

  3. 前后端分离进阶一:使用ElementUI+前端分页

    前两篇入门:前后端分离初体验一:前端环境搭建 前后端分离初体验二:后端环境搭建+数据交互 参考:https://www.bilibili.com/video/BV137411B7vB B站UP:楠哥教 ...

  4. SimpleNVR如何把安防监控画面推流到微信公众号直播

    背景需求 进入移动互联网时代以来,微信已成为许多企业除官网以外必备的宣传渠道,当3.2亿直播用户与九亿微信用户的势能增加,在微信上开启直播已成为越来越多企业的不二选择. 需求分析 微信公众号作为平台来 ...

  5. 🏆【Alibaba中间件技术系列】「Sentinel技术专题」分布式系统的流量防卫兵的基本介绍(入门源码介绍)

    推荐资料 官方文档 官方demo Sentinel 是什么? 随着微服务的流行,服务和服务之间的稳定性变得越来越重要.Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护 ...

  6. 20. VIM命令操作技巧

    V可视化选中当前行,根据光标可多行 ctrl+v 可视化块 v可视化根据光标 行间移动 快速增删改查 d 0 删除当前位置到行首 d $ 删除当前位置到行尾 d  t  (" ] ) )符号 ...

  7. 数仓day01

    1. 该项目适用哪些行业? 主营业务在线上进行的一些公司,比如外卖公司,各类app(比如:下厨房,头条,安居客,斗鱼,每日优鲜,淘宝网等等) 这类公司通常要针对用户的线上访问行为.消费行为.业务操作行 ...

  8. mysql 索引 零记

    索引算法 二分查找法/折半查找法 伪算法 : 1. 前提,数据需要有序 2. 确定数据中间元素 K 3. 比如目标元素 A与K的大小 3.1 相等则找到 3.2  小于时在左区间 3.3  大于时在右 ...

  9. Servlet(1):Servlet介绍

    一. Servlet介绍 Servlet 是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生 ...

  10. eclipse.ini顺序

    -vmargs需放在-Dfile.encoding=UTF-8之前,否则会出现乱码 举例: -startup plugins/org.eclipse.equinox.launcher_1.3.0.v2 ...