[LeetCode] 200. Number of Islands 岛屿的数量
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
Example 1:
11110
11010
11000
00000
Answer: 1
Example 2:
11000
11000
00100
00011
Answer: 3
Credits:
Special thanks to @mithmatt for adding this problem and creating all test cases.
本质是求矩阵中连续区域的个数, 可以用BFS, DFS, 或者 Union Find来解。
Java: BFS
class Coordinate {
int x, y;
public Coordinate(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Solution {
public int numIslands(boolean[][] grid) {
if (grid == null || grid.length == 0 || grid[0].length == 0) {
return 0;
}
int n = grid.length;
int m = grid[0].length;
int islands = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j]) {
markByBFS(grid, i, j);
islands++;
}
}
}
return islands;
}
private void markByBFS(boolean[][] grid, int x, int y) {
int[] directionX = {0, 1, -1, 0};
int[] directionY = {1, 0, 0, -1};
Queue<Coordinate> queue = new LinkedList<>();
queue.offer(new Coordinate(x, y));
grid[x][y] = false;
while (!queue.isEmpty()) {
Coordinate coor = queue.poll();
for (int i = 0; i < 4; i++) {
Coordinate adj = new Coordinate(
coor.x + directionX[i],
coor.y + directionY[i]
);
if (!inBound(adj, grid)) {
continue;
}
if (grid[adj.x][adj.y]) {
grid[adj.x][adj.y] = false;
queue.offer(adj);
}
}
}
}
private boolean inBound(Coordinate coor, boolean[][] grid) {
int n = grid.length;
int m = grid[0].length;
return coor.x >= 0 && coor.x < n && coor.y >= 0 && coor.y < m;
}
}
Java: DFS
public class Solution {
private int m, n;
public void dfs(boolean[][] grid, int i, int j) {
if (i < 0 || i >= m || j < 0 || j >= n) return;
if (grid[i][j]) {
grid[i][j] = false;
dfs(grid, i - 1, j);
dfs(grid, i + 1, j);
dfs(grid, i, j - 1);
dfs(grid, i, j + 1);
}
}
public int numIslands(boolean[][] grid) {
m = grid.length;
if (m == 0) return 0;
n = grid[0].length;
if (n == 0) return 0;
int ans = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (!grid[i][j]) continue;
ans++;
dfs(grid, i, j);
}
}
return ans;
}
}
Java: Union Find
class UnionFind {
private int[] father = null;
private int count;
private int find(int x) {
if (father[x] == x) {
return x;
}
return father[x] = find(father[x]);
}
public UnionFind(int n) {
// initialize your data structure here.
father = new int[n];
for (int i = 0; i < n; ++i) {
father[i] = i;
}
}
public void connect(int a, int b) {
int root_a = find(a);
int root_b = find(b);
if (root_a != root_b) {
father[root_a] = root_b;
count --;
}
}
public int query() {
return count;
}
public void set_count(int total) {
count = total;
}
}
public class Solution {
public int numIslands(boolean[][] grid) {
int count = 0;
int n = grid.length;
if (n == 0)
return 0;
int m = grid[0].length;
if (m == 0)
return 0;
UnionFind union_find = new UnionFind(n * m);
int total = 0;
for(int i = 0;i < grid.length; ++i)
for(int j = 0;j < grid[0].length; ++j)
if (grid[i][j])
total ++;
union_find.set_count(total);
for(int i = 0;i < grid.length; ++i)
for(int j = 0;j < grid[0].length; ++j)
if (grid[i][j]) {
if (i > 0 && grid[i - 1][j]) {
union_find.connect(i * m + j, (i - 1) * m + j);
}
if (i < n - 1 && grid[i + 1][j]) {
union_find.connect(i * m + j, (i + 1) * m + j);
}
if (j > 0 && grid[i][j - 1]) {
union_find.connect(i * m + j, i * m + j - 1);
}
if (j < m - 1 && grid[i][j + 1]) {
union_find.connect(i * m + j, i * m + j + 1);
}
}
return union_find.query();
}
}
Python: BFS
class Solution:
def numIslands(self, grid):
m = len(grid)
if m == 0:
return 0
n = len(grid[0])
visit = [[False for i in range(n)]for j in range(m)]
def check(x, y):
if x >= 0 and x < m and y >= 0 and y < n and grid[x][y] and visit[x][y] == False:
return True
def bfs(x,y):
nbrow = [1, 0, -1, 0]
nbcol = [0, 1, 0, -1]
q =[(x,y)]
while len(q) > 0:
x = q[0][0]
y = q[0][1]
q.pop(0)
for k in range(4):
newx = x + nbrow[k]
newy = y + nbcol[k]
if check(newx, newy):
visit[newx][newy] = True
q.append((newx,newy)) count = 0
for row in range(m):
for col in range(n):
if check(row,col):
visit[row][col] = True
bfs(row,col)
count+=1
return count
Python: DFS
class Solution:
def numIslands(self, grid):
if not grid:
return 0 row = len(grid)
col = len(grid[0])
count = 0
for i in xrange(row):
for j in xrange(col):
if grid[i][j] == '1':
self.dfs(grid, row, col, i, j)
count += 1
return count def dfs(self, grid, row, col, x, y):
if grid[x][y] == '0':
return
grid[x][y] = '0' if x != 0:
self.dfs(grid, row, col, x - 1, y)
if x != row - 1:
self.dfs(grid, row, col, x + 1, y)
if y != 0:
self.dfs(grid, row, col, x, y - 1)
if y != col - 1:
self.dfs(grid, row, col, x, y + 1)
Python: DFS
class Solution(object):
def findIslands(self, M):
if not M:
return 0 res = 0
for i in xrange(len(M)):
for j in xrange(len(M[0])):
if M[i][j] == 1:
res += 1
self.dfs(M, i, j) return res def dfs(self, m, x, y):
if m[x][y] == 1:
m[x][y] = 0
if x > 0:
self.dfs(m, x - 1, y)
if y > 0:
self.dfs(m, x, y - 1)
if x < len(m) - 1:
self.dfs(m, x + 1, y)
if y < len(m[0]) - 1:
self.dfs(m, x, y + 1)
Python: BFS
class Solution(object):
def findIslands(self, M):
if not M:
return 0 res = 0
for i in xrange(len(M)):
for j in xrange(len(M[0])):
if M[i][j] == 1:
res += 1
print res
self.bfs(M, i, j) return res def checkPoint(self, m, x, y):
if x < 0 or y < 0 or x > len(m) - 1 or y > len(m[0]) - 1 or m[x][y] == 0:
return False return True def bfs(self, m, x, y):
x_row = [0, 0, -1, 1]
y_col = [-1, 1, 0, 0]
queue = [(x, y)]
while len(queue) > 0:
point = queue.pop(0)
row = point[0]
col = point[1]
if m[row][col] == 1:
m[row][col] = 0
for i in xrange(4):
if self.checkPoint(m, row + x_row[i], col + y_col[i]):
queue.append((row + x_row[i], col + y_col[i]))
Python: DFS
class Solution:
def numIslands(self, grid):
m = len(grid)
if m == 0:
return 0
n = len(grid[0])
visit = [[False for i in range(n)]for j in range(m)]
def check(x, y):
if x >= 0 and x < m and y >= 0 and y < n and grid[x][y] and visit[x][y] == False:
return True
def dfs(x, y):
nbrow = [1,0,-1,0]
nbcol = [0,1,0,-1]
for k in range(4):
newx = x + nbrow[k]
newy = y + nbcol[k]
if check(newx, newy):
visit[newx][newy] = True
dfs(newx,newy)
count = 0
for row in range(m):
for col in range(n):
if check(row, col):
visit[row][col] = True
dfs(row, col)
count+=1
return count
类似题目:
[LeetCode] 305. Number of Islands II 岛屿的数量 II
[LeetCode] 547. Friend Circles 朋友圈
[LeetCode] 79. Word Search 单词搜索
All LeetCode Questions List 题目汇总
[LeetCode] 200. Number of Islands 岛屿的数量的更多相关文章
- LeetCode 200. Number of Islands 岛屿数量(C++/Java)
题目: Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is s ...
- [leetcode]200. Number of Islands岛屿个数
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
- [leetcode]200. Number of Islands岛屿数量
dfs的第一题 被边界和0包围的1才是岛屿,问题就是分理出连续的1 思路是遍历数组数岛屿,dfs四个方向,遇到1后把周围连续的1置零,代表一个岛屿. /* 思路是:遍历二维数组,遇到1就把周围连续的1 ...
- 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】200. Number of Islands 岛屿数量
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...
- [LeetCode] Number of Islands 岛屿的数量
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
- [LeetCode] 0200. Number of Islands 岛屿的个数
题目 Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is su ...
- [LintCode] Number of Islands 岛屿的数量
Given a boolean 2D matrix, find the number of islands. Notice 0 is represented as the sea, 1 is repr ...
- Java for LeetCode 200 Number of Islands
Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...
随机推荐
- 在vue项目中使用axios
安装 cnpm i axios --save-dev 在项目main.js中全局引用 import axios from "axios" Vue.prototype.$http=a ...
- luoguU60884 【模板】动态点分治套线段树
题目连接:https://www.luogu.org/problemnew/show/U60884 题意:有N个点,标号为1∼N,用N−1条双向带权通道连接,保证任意两个点能互相到达. Q次询问,问从 ...
- 【转】RabbitMQ 关键词
[转]RabbitMQ 关键词 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. RabbitMQ中间件分为服务端(Rabb ...
- LeetCode 959. Regions Cut By Slashes
原题链接在这里:https://leetcode.com/problems/regions-cut-by-slashes/ 题目: In a N x N grid composed of 1 x 1 ...
- Java LinkedList add vs push
Java LinkedList add 是加在list尾部. LinkedList push 施加在list头部. 等同于addFirst.
- LeetCode 708. Insert into a Cyclic Sorted List
原题链接在这里:https://leetcode.com/problems/insert-into-a-cyclic-sorted-list/ 题目: Given a node from a cycl ...
- 数据库服务器和web服务器磁盘占用查询
对于Oracle数据库而言磁盘空间主要体现在表空间上,可使用sql语句进行查看Oracle 表空间的大小及使用情况: select sum(bytes)/1024/1024/1024 "Gb ...
- 2019-2020-1 20199302《Linux内核原理与分析》第十一周作业
缓冲区溢出 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢 ...
- 文件搜索命令find
1.路径加文件名搜索(find): 查找的是etc目录下的以init为名字的文件. 加通配符后为模糊搜索,只要文件名中含有init即可. 查找etc目录下以init开头的七位文件名. 2.搜索时不区分 ...
- The database returned no natively generated identity value错误解决方案
原因:hibernate项目中在学生表的配置文件中: <id name="studentno" column="studentno"> <ge ...