[题解] 岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

用并查集来统计

class Solution {
public:
    int fa[100000];
    int sets;
    int find(int x) {
        if(fa[x] != x) {
            fa[x] = find(fa[x]);
        }
        return fa[x];
    }
    void merge(int x,int y) {
        int fx = find(x),fy = find(y);
        if(fx != fy) {
            fa[fx] = fy;
            sets--;
        }
    }
    int numIslands(vector<vector<char>>& grid) {
        int n = grid.size();
        int m = grid[0].size();
        sets = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(grid[i][j] == '1') {
                    fa[i*m + j] = i*m + j;
                    sets++;
                }
            }
        }
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(grid[i][j] == '1') {
                    if(j - 1 >= 0 && grid[i][j-1] == '1') {
                        merge(i*m+j,i*m+j-1);
                    }
                    if(i - 1 >= 0 && grid[i-1][j] == '1') {
                        merge(i*m+j,(i-1)*m+j);
                    }
                }
            }
        }
        return sets;
    }
};
github