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. 岛屿数量的主要内容,如果未能解决你的问题,请参考以下文章

岛屿问题(岛数量/孤岛/面积/周长)

岛屿问题(岛数量/孤岛/面积/周长)

LeetCode 200. 岛屿数量

200. 岛屿数量(Python)

精选力扣500题 第41题 LeetCode 200. 岛屿数量c++/java详细题解

力扣 200. 岛屿数量