[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 ...
随机推荐
- js 函数的this指向
一. 1.es5: 函数里的this指向分两种,一种正常函数调用指向被调用的对象,比如: test=()=>{ console.log(this) }; test();//是当前window调用 ...
- Oracle锁表与解锁 对象锁与解锁
阅读目录 锁表与解锁 查看锁表进程SQL语句 解锁 对象锁与解锁 回到顶部 锁表与解锁 查看锁表进程SQL语句 select * from v$session t1, v$locked_object ...
- 使用SecureCRT操作linux系统时候的简单设置
因为第一次访问一台虚拟机的时候会出现这样的情况; 底色为白色和乱码的情况 需要在选项----->会话选项中进行一些设置 用来解决乱码问题的这个设置为:
- Centos7-安装py3
安装依赖 yum install gcc openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel li ...
- Dubbo源码分析:Serialization
背景 顺序化逻缉处理! 类图 获取Serialization对象时序图 序列化
- Python的可变类型和不可变类型?
Python的每个对象都分为可变和不可变可变:列表.字典 不可变:数字.字符串.元组
- junit4的进一步探讨
上次只是大概记录了下junit4几个常见标签的用法. 在这篇文章中,我们来进一步分析junit4的用法. 1.断言 junit4中一个很常见的用法就是断言.说到断言,大家再熟悉不过了.不过也许有的朋友 ...
- Jmeter+ant+jekins环境配置
Jmeter+ant+jekins 一.ant安装 1. ant安装 官网下载http://ant.apache.org 解压到想要的盘里面 2. 配置环境变量 (1)变量名:ANT_HOME 变量值 ...
- 【洛谷P4585】 [FJOI2015]火星商店问题 线段树分治+可持久化trie
感觉这个线段树分治和整体二分几乎相同啊~ code: #include <bits/stdc++.h> #define MAX 100300 #define ll long long #d ...
- ArrayList 集合:库存管理
import java.util.ArrayList; import java.lang.Integer; import java.util.Scanner; import java.util.Ran ...