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 岛屿的数量的更多相关文章

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

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

  3. [leetcode]200. Number of Islands岛屿数量

    dfs的第一题 被边界和0包围的1才是岛屿,问题就是分理出连续的1 思路是遍历数组数岛屿,dfs四个方向,遇到1后把周围连续的1置零,代表一个岛屿. /* 思路是:遍历二维数组,遇到1就把周围连续的1 ...

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

  5. 【LeetCode】200. Number of Islands 岛屿数量

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS BFS 日期 题目地址:https://le ...

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

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

  8. [LintCode] Number of Islands 岛屿的数量

    Given a boolean 2D matrix, find the number of islands. Notice 0 is represented as the sea, 1 is repr ...

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

随机推荐

  1. 洛谷 P1443 马的遍历题解

    题目链接:https://www.luogu.org/problem/P1443 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个 ...

  2. LeetCode初级算法--其他01:位1的个数

    LeetCode初级算法--其他01:位1的个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  3. ASP.NET Core ---- 系列文章

    (13)ASP.NET Core 中的选项模式(Options) (12)ASP.NET Core 中的配置二(Configuration) (11)ASP.NET Core 中的配置一(Config ...

  4. luoguU60884 【模板】动态点分治套线段树

    题目连接:https://www.luogu.org/problemnew/show/U60884 题意:有N个点,标号为1∼N,用N−1条双向带权通道连接,保证任意两个点能互相到达. Q次询问,问从 ...

  5. Centos7.6安装docker-compose

    官网地址:https://docs.docker.com/compose/install/ 运行此命令以下载Docker Compose的当前稳定版本 sudo curl -L "https ...

  6. python 中的tile函数,shape函数,sum函数

    1.tile函数: tile函数是模板numpy.lib.shape_base中的函数.函数的形式是tile(A,reps) A的类型几乎所有类型都可以:array, list, tuple, dic ...

  7. django-改写manage类-objects

    user/models.py中 class AddressManage(models.Manager): '''地址模型管理类''' def get_default_addr(self, user): ...

  8. Django API view 登录认证

    文件分类 url from django.contrib import admin from django.urls import path, re_path from django.urls imp ...

  9. eclipse 配置python环境 json 插件

    windows->install new software add 配置python 环境: name:pydev(可随意写) url:http://pydev.org/updates/ (如果 ...

  10. 解决IE报错:Locale 'chinese' is not well-formed,或RangeError: 区域设置“chinese”的格式不正确的问题

    接之前的此博客问题处理:js处理时间时区问题 由于 toLocaleString():据本地时间格式,把 Date 对象转换为字符串.总是会带有上午/下午,所以我加了参数:new Date('2019 ...