[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) 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.
这个题目可以理解为是[LeetCode] 200. Number of Islands_ Medium tag: BFS的变形, 不仅仅是要判断有多少个island, 并且是要unique的, 不能翻转, 那么如果做呢, 因为我们scan的时候是一行一行得scan, 用DFS去scan的时候也有它的先后顺序, 所以可以通过每次用DFS的时候将路径记下来, 并且add进入一个ans的set里面, 最后返回len(ans), 就是distinct islands的数目了.
updated at 07/10, 参考题目的Solution, 思路跟之前类似, 只不过, 每个island我们将坐标都变为local的坐标, 相当于以最开始的坐标作为原点坐标, 获得相对坐标的位置, 然后将该路径记下来, 并且将其变为tuple然后add进入一个ans的set里面, 最后返回len(ans).
Updated at 08/17, 将local location的code update更加elegant.
1. Constraints
1) grid can be empty,
2) grid size <= 50 * 50
3) element will only be 0 or 1
2. Ideas
DFS: T: O(m*n) S: O(m*n)
1) edge case, not grid or len(grid[0]) == 0, return 0
2) grid[i][j] if not visited, dfs(得到它的路径), 并add进入ans 的set
3) 对于dfs, 记住路径, 并且append进入dirs
4) 返回len(ans)
3. Code
class Solution:
def numDistinctIslands(self, grid):
if not gird or len(grid[0]) == 0: return 0
lr, lc, ans, visited = len(grid), len(grid[0]), set(), set() def dfs(grid, i, j, visited, dirs, dirt):
if 0<= i < len(grid) and 0 <= j < len(grid[0]) and grid[i][j] == 1 and (i, j) not in visited:
visited.add((i,j))
dirs.append(dirt)
dfs(grid, i-1, j, visited, dirs, 'u')
dfs(grid, i+1, j, visited, dirs, 'd')
dfs(grid, i, j-1, visited, dirs, 'l')
dfs(grid, i, j+1, visited, dirs, 'r')
dirs.append('b') # if no this line, [[110],[011],[000],[111],[010]] can not pass
for i in range(lr):
for j in range(lc):
if grid[i][j] == 1 and (i,j) not in visited:
dirs = []
dfs(grid, i, j,visited, dirs, 'o' )
ans.add("".join(dirs))
return len(ans)
3.1 Code(利用loca 相对坐标位置)
class Solution:
def numberDistinctIslands(self, grid):
if not grid or len(grid[0]) == 0: return 0
lrc, ans, visited = [len(grid), len(grid[0])], set(), set()
def dfs(i,j,i0,j0):
if 0 <= i < lrc[0] and 0 <= j < lrc[1] and grid[i][j] and (i,j) not in visited:
temp.append((i-i0, j-j0))
visited.add((i,j))
dfs(i-1,j,i0,j0)
dfs(i+1,j,i0,j0)
dfs(i,j+1,i0,j0)
dfs(i,j-1,i0,j0) for i in range(lrc[0]):
for j in range(lrc[1]):
temp = []
dfs(i,j,i,j)
if temp:
ans.add(tuple(temp)) # note: set 里面必须是tuple,不能是list。
return len(ans)
4. Test cases
1) edge cases
2) [[110],[011],[000],[111],[010]]
3)
11011
10000
00001
11011
[LeetCode] 694. Number of Distinct Islands的更多相关文章
- [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 ...
- [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 ...
- [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 ...
- 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 用了第一种方式, ...
- 【LeetCode】694. Number of Distinct Islands 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetcod ...
- [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 ...
- 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 ...
- [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 ...
- [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 ...
随机推荐
- Qt编写视频播放器(vlc内核)
在研究qt+vlc的过程中,就想直接做个播放器用于独立的项目,vlc还支持硬件加速,不过部分电脑硬件不支持除外.用vlc的内核写播放器就是快,直接调用api就行,逻辑处理和ui展示基本上分分钟的事情, ...
- 金蝶KIS问题解决汇总
1.帐套结转时,提示t_subsys插入重复键 解决: I.删除索引 alter table t_subsys drop constraint pk_subsys II.t_rp_initial表 ...
- css3整理--gradient
gradient语法: -moz-linear-gradient( [<point> || <angle>,]? <stop>, <stop> [, & ...
- java(7)LinkedList源码
系统环境 JDK1.7 LinkedList的基本结构 :在JDK1.6中LinkedList是双向引用的环形结构,JDK1.6中是双向引用的线性结构 提醒:看链表代码时最好用笔画下链表结构 有助于理 ...
- JVM学习--开启应用的gc日志功能
一.开启方法 For Java 1.4, 5, 6, 7, 8 pass this JVM argument to your application: -XX:+PrintGCDetails -XX: ...
- Dumb Bones UVA - 10529[多米诺重构]
Dumb Bones UVA - 10529 来自绿书p176 题意 你试图把一些多米诺骨牌排成直线,然后推倒它们.但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰 ...
- R生存分析AFT
γ = 1/scale =1/0.902 α = exp(−(Intercept)γ)=exp(-(7.111)*γ) > library(survival) > myfit=survre ...
- java8新特性之Optional类
NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...
- Linux下搭建Hadoop集群(Centos7.0)
Hadoop集群安装 概述 集群 cluster,将很多任务进程分布到多台计算机上:通过联合使用多台计算机的存储.计算能力完成更庞大的任务.为了实现无限量的存储和计算能力,在生产环境中必须使用集群来满 ...
- MPD大会北京上海两站圆满落幕
MPD大会北京上海两站圆满落幕 由麦思博(MSUP)主办的亚太软件研发团队管理峰会(以下简称MPD大会)分别于6月15及6月22日在北京.上海成功举办.国内外知名软件.互联网行业项目领头人及业内从业人 ...