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 they have the same shape, or have the same shape after rotation (90, 180, or 270 degrees only) or reflection (left/right direction or up/down direction).

Example 1:

11000
10000
00001
00011

Given the above grid map, return 1.

Notice that:

11
1

and

 1
11

are considered same island shapes. Because if we make a 180 degrees clockwise rotation on the first island, then two islands will have the same shapes.

Example 2:

11100
10001
01001
01110

Given the above grid map, return 2.

Here are the two distinct islands:

111
1

and

1
1

Notice that:

111
1

and

1
111

are considered same island shapes. Because if we flip the first array in the up/down direction, then they have the same shapes.

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

Update 08/17/2018: 注意不能利用 [LeetCode] 694. Number of Distinct Islands里面的dfs function然后直接sort, 否则的话会有负数, 比如

0 1

1 1, 因此我们直接tuple(shape), 然后通过得到xMin, yMin, 然后去tuple.(这样可以避免负数的情况)

这个题目实际上就是[LeetCode] 694. Number of Distinct Islands 的变形, 我们实际上还是用那个题目的updated的做法, 用DFS去记录它的相对local 位置, 然后针对翻转和对称能够改变的加上original 位置, 总共有8 种情况, 如果original的每个坐标为(x,y), 那么其他的情况分别为(-x, y), (x,-y), (-x, -y), (y,x), (-y, x), (y, -x), (-y, -x), 只不过因为我们要的是相对位置, 那么每次在改变符号的时候要加上 Xmax or Ymax(注意的是变为local的坐标之后的max), 然后每次判断产生的local 位置在不在我们的shapes这个set里面, 如果不在的话, ans += 1, 并且将8种情况都加入到shapes 的set里面, 最后返回ans即可, 其实相对于694的题目, 只是加入了一个addIsland函数来判断是否可以翻转或者对称来跟已经有的local位置去进行比较.

1. Constraints

1) grid 可以empty, edge

2) max size will be [50*50]

3) each element will be 0 or 1

2. 思路

DFS, 因为中间有排序的过程, 所以我认为   T; O(m*n lg(m*n))      S; O(m*n)

3. Code

class Solution(object):
def numDistinctIslands2(self, grid):
if not grid or len(grid[0]) == 0 : return 0
lrc, visited, ans, shapes = [len(grid), len(grid[0])], set(), [0], set()
def dfs(i,j):
if 0<= i < lrc[0] and 0 <= j < lrc[1] and grid[i][j] and (i,j) not in visited:
visited.add((i,j))
shape.append((i, j))
dfs(i-1, j)
dfs(i+1, j)
dfs(i, j-1)
dfs(i, j+1)
def addShape(shape, shapes):
xs, ys = zip(*shape) # get xMin, yMin from original shape
xMin, yMin = min(xs), min(ys) # note: 必须通过这种方式来去得到local全部是正数的tuple
island0 = tuple(sorted((x-xMin, y - yMin) for x,y in shape))
if island0 in shapes: return
ans[0] += 1
xs, ys = zip(*island0) # get xMax, yMax from island0
xMax, yMax = max(xs) , max(ys)
island1 = tuple(sorted((-x + xMax, y ) for x, y in island0))
island2 = tuple(sorted((x, -y + yMax ) for x, y in island0))
island3 = tuple(sorted((-x + xMax, -y + yMax) for x, y in island0)) island4 = tuple(sorted((y, x) for x, y in island0))
island5 = tuple(sorted((-y + yMax, x) for x, y in island0))
island6 = tuple(sorted((y, -x + xMax) for x, y in island0))
island7 = tuple(sorted((-y + yMax, -x + xMax) for x, y in island0)) shapes |= set([island0, island1, island2, island3, island4, island5, island6, island7]) for i in range(lrc[0]):
for j in range(lrc[1]):
shape = []
dfs(i,j)
if shape:
addShape(shape, shapes)
return ans[0]

4. test cases

the test cases in the beginning.

[LeetCode] 711. Number of Distinct Islands II_hard tag: DFS的更多相关文章

  1. [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 ...

  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] 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 ...

  5. LC 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 ...

  6. [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 ...

  7. [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 ...

  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 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 用了第一种方式, ...

随机推荐

  1. 原生js--客户端存储的种类

    客户端存储遵循同源策略,不同的站点页面之间不可以相互读取对方的数据,但同一站点的不同页面之间可以共享存储的数据 客户端存储的种类: 1.web存储 localStorage.sessionStorag ...

  2. Elasticsearch学习之基本核心概念

    在Elasticsearch中有许多术语和概念 1. 核心概念 Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引可以包含多个类型(types)(表),每一个类型包 ...

  3. LeetCode 37 Sudoku Solver(求解数独)

    题目链接: https://leetcode.com/problems/sudoku-solver/?tab=Description   Problem : 解决数独问题,给出一个二维数组,将这个数独 ...

  4. LeetCode 30 Substring with Concatenation of All Words(确定包含所有子串的起始下标)

    题目链接: https://leetcode.com/problems/substring-with-concatenation-of-all-words/?tab=Description   在字符 ...

  5. if中的-n -z linux_Shell

    ==========1 混淆的-n  -z================= -n 表示这个变量或者字符串是否不为空.-z 表示这个变量或者字符串为空 上面这两句话中最重要的点是不通的 -n 关注的是 ...

  6. vue-loader的简单例子

    一.模块加载器 1.broserify 模块加载器, 只能加载js 2.webpack 模块加载器, 一切东西都是模块, 最后打包到一块 .vue文件  ==> 需要用webpack编译成浏览器 ...

  7. PostgreSQL9.4如何指定数据库schema

    在PostgreSQL中数据库可以有多个schema,在程序访问的时候如果不做特殊的设置,默认连接的是名为public的schema. 那么,如何设置能够让程序去访问特定的schema呢?之前在网上找 ...

  8. django的queryset和objects对象

    1. queryset是查询集,就是传到服务器上的url里面的内容.Django会对查询返回的结果集QerySet进行缓存,这里是为了提高查询效率. 也就是说,在你创建一个QuerySet对象的时候, ...

  9. [转]-[携程]-A Hybrid Collaborative Filtering Model with Deep Structure for Recommender Systems

    原文链接:推荐系统中基于深度学习的混合协同过滤模型 近些年,深度学习在语音识别.图像处理.自然语言处理等领域都取得了很大的突破与成就.相对来说,深度学习在推荐系统领域的研究与应用还处于早期阶段. 携程 ...

  10. Java 8新增的Lambda表达式

    一. 表达式入门 Lambda表达式支持将代码块作为方法参数,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例,相当于一个匿名的方法. 1.1 La ...