200. 岛屿数量
Posted 易小顺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了200. 岛屿数量相关的知识,希望对你有一定的参考价值。
算法记录
LeetCode 题目:
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
说明
一、题目
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
二、分析
- 在遍历数组时只需要对数值为
1
的位置进行处理即可,岛屿的数量即可转换为求取1
的集合的数量。 - 要看一个点是否和其他点相连接,需要判断其 上、下、左、右 是否有邻接。
- 而我们的遍历方向是从上至下,从左至右的,因此可以只判断当前点的上方和左方点即可。
class Solution {
class UnionFind{
int[] data;
public UnionFind(int n) {
data = new int[n];
for(int i = 0; i < n; i++)
data[i] = i;
}
public int find(int x) {
if(data[x] != x) data[x] = find(data[x]);
return data[x];
}
public int add(int a, int b) {
int x = find(a);
int y = find(b);
if(x == y) return 0;
data[x] = y;
return 1;
}
}
public int numIslands(char[][] grid) {
int row = grid.length;
int col = grid[0].length;
UnionFind unionFind = new UnionFind(row * col);
int num = 0;
for(int i = 0; i < row; i++)
for(int j = 0; j < col; j++) {
if(grid[i][j] == '0') continue;
if((i != 0) && (grid[i-1][j] == '1'))
unionFind.add(i * col + j, (i - 1) * col + j);
if((j != 0) && (grid[i][j-1] == '1'))
unionFind.add(i * col + j, i * col + j - 1);
}
for(int i = 0; i < row; i++)
for(int j = 0; j < col; j++) {
if(grid[i][j] == '0') continue;
if(unionFind.find(i * col + j) == (i * col + j)) num++;
}
return num;
}
}
总结
熟悉并查集应用集合连接。
以上是关于200. 岛屿数量的主要内容,如果未能解决你的问题,请参考以下文章