题目地址: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. go变量、类的概念以及类的使用方式,嵌套结构体

    go变量.类的概念以及类的使用方式,嵌套结构体 Go变量 go使用var声明变量,当声明变量时,这个变量对应的值总是会被初始化.这个值要么用指定的值初始化,要么用零值(即变 量类型的默认值)做初始化. ...

  2. Excel-姓名列中同一个人汇总金额列,得出总金额

    8.姓名列中同一个人求和金额列,得出总金额. 方法一: P2处公式=SUMPRODUCT(($M$2:$M$20=$M2)*($N$2:$N$20)) 解释函数: 引用:https://zhinan. ...

  3. [转载]ORA-02287: 此处不允许序号

    原文地址:ORA-02287: 此处不允许序号作者:nowhill 转载自 http://blog.sina.com.cn/s/blog_6d496bad01011dyv.html 开发人员反映序列不 ...

  4. abort, about

    abort 变变变: abortion:堕胎 abortionist:(非法)做堕胎手术的,不是所有的ist都是scientist, "All that glitters is not go ...

  5. c++ cmake及包管理工具conan简单入门

    cmake是一个跨平台的c/c++工程管理工具,可以通过cmake轻松管理我们的项目 conan是一个包管理工具,能够自动帮助我们下载及管理依赖,可以配合cmake使用 这是一个入门教程,想深入了解的 ...

  6. Redis6 新特性

    Redis6新特性 ACL安全策略 ACL(access control list): 访问控制列表,可以设置多个用户,并且给每个用户单独设置命令权限和数据权限 default用户和使用require ...

  7. js实现点击不同按钮切换内容

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. PHP之CURL实现含有验证码的模拟登录

    博主最近在为学校社团写一个模拟登录教务系统来进行成绩查询的功能,语言当然是使用PHP啦,原理是通过php数据传输神器---curl扩展,向学校教务系统发送请求,通过模拟登录,获取指定url下的内容. ...

  9. 【C/C++】例题5-4 反片语/算法竞赛入门经典/C++与STL入门/映射:map

    本题是映射:map的例题. map:键值对. [题目] 输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词. 在判断是否满足条件时,字母不分大小写,但在输出 ...

  10. 【Git】【Gitee】通过git远程删除仓库文件

    安装Git Git安装配置-菜鸟教程 没有安装下载的,请读者自行安装下载. 启动与初步配置 配置用户名与邮箱 git config --global user.name "用户名" ...