题目地址: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. EXCEL-对筛选出(单独手动隐藏行还是在统计范围内)的表格数据进行统计

    =SUBTOTAL(3,A1:A5)  #计算筛选出的表格中A1:A5中有几个值. =SUBTOTAL(3,I71:I21447)  ,在I71:I21447之间计数,会自动略去没有筛选上的隐藏单元格 ...

  2. shell 脚本的基本定义

    注意不能有控制,指令之间 [1]shell脚本的基础知识 (1)shell脚本的本质 编译型语言 解释型语言 shell脚本语言是解释型语言 shell脚本的本质 shell命令的有序集合 (2)sh ...

  3. KeepAlived双主模式高可用集群

    keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中的定义生成ipvs规则,并能够对各RS的健康状态进行检测:通过共用的虚拟IP地址对外提 ...

  4. dart系列之:HTML的专属领域,除了javascript之外,dart也可以

    目录 简介 DOM操作 CSS操作 处理事件 总结 简介 虽然dart可以同时用作客户端和服务器端,但是基本上dart还是用做flutter开发的基本语言而使用的.除了andorid和ios之外,we ...

  5. LeetCode子矩形查询

    LeetCode 子矩形查询 题目描述 请你实现一个类SubrectangleQueries,它的构造函数的参数是一个rows * cols的矩形(这里用整数矩阵表示),并支持以下两种操作: upda ...

  6. 日常Java 2021/10/6

    声明自定义异常 class zidingyiException extends Exception{}//定义自己的异常类 单继承 public class A  {} public class B ...

  7. YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关

    YARP 是微软开源的一个反向代理项目,英文名叫 Yet Another Reverse Proxy .所谓反向代理最有名的那就是 nginx 了,没错 YARP 也可以用来完成 nginx 的大部分 ...

  8. day16 循环导入、模块搜索路径、软件开发、包的使用

    day16 循环导入.模块搜索路径.软件开发.包的使用 1.循环导入 循环导入:循环导入问题指的是在一个模块加载/导入的过程中导入另外一个模块,而在另外一个模块中又返回来导入第一个模块中的名字,由于第 ...

  9. C++ 之杂记

    今天做了一个题,代码不难,但是编译的时候就恼火,老是报错,也不告诉我错哪了.... 之前的代码是这样的,在main函数中调用这个类的构造函数,就一直报错,但是不知道原因,后来加上了const 就好了. ...

  10. mybatis-plus条件构造用is开头的Boolean类型字段时遇到的问题

    is打头的Boolean字段导致的代码生成器与lambda构造器的冲突 https://gitee.com/baomidou/mybatis-plus/issues/I171DD?_from=gite ...