[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 ...
随机推荐
- 【gitlab】创建ssh 秘钥
1).首先打开linux服务器,输入命令:ls -al ~/.ssh,检查是否显示有id_rsa.pub或者id_dsa.pub存在,如果存在请直接跳至第3步. 2).在bash中输入,注意这个地方的 ...
- laravel调用sql server存储过程并取得ReturnValue
alter proc [dbo].[aaa]( @AgencyID int,--代理商ID @AdminID int --结算操作人ID(管理员ID))asbegin select ...
- 异构GoldenGate 12c 单向复制配置
1.分别在windows2008.linux平台部署oracle 11.2.0.4 2.分别在windows2008.linux平台部署gg. 2.1 windows平台: gg的安装目录位 C:\o ...
- HashRouter与BrowserRouter的异同
项目中控制路由跳转使用的是BrowserRouter 在开发过程中使用是没有问题的,但是将页面上传至服务器之后,问题就来了:用户访问的资源不存在,页面是空白的. 原因: 在browserHistory ...
- jenkins部署war包到远程服务器的tomcat
一.目的 jenkins上将war包,部署到远程服务器的tomcat上. 这边tomcat在windows 主机A上,版本apache-tomcat-8.5.23. jenkins在主机B上,cent ...
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
- Cracking the Coding Interview(linked list)
第二章的内容主要是关于链表的一些问题. 基础代码: class LinkNode { public: int linknum; LinkNode *next; int isvisit; protect ...
- VI 你不知道的事
1G 顶部 G 底部 ctrl+F 前进 ctrl+B 后退 /text 向前搜索 ?text 向后搜索 I i 插入字符串 a 光标后插入字符 A 跳到句末尾 wq 写入并退出 h k j l ...
- nodejs事件的监听与事件的触发
nodejs事件(Events) 一.事件机制的实现 Node.js中大部分的模块,都继承自Event模块(http://nodejs.org/docs/latest/api/events.html ...
- 使用Homebrew在Mac OS X EI Capitan上安装与配置nginx和PHP
安装nginx brew install nginx sudo nginx 测试安装 在浏览器打开下面的链接地址 http://localhost:8080 nginx.conf配置 # HTTPS ...