leetcode 200. 岛屿数量

104 阅读1分钟

c++

class Solution {
public:
    class UnionSet {
    public:
        int *father, n;
        UnionSet(int n) : n(n) {
            father = new int[n + 1]; 
            for (int i = 0; i <= n; i++) {
                father[i] = i;
            }
        }
        int find(int x) {
            return father[x] = (father[x] == x ? x : find(father[x]));
        }
        void merge(int a, int b) {
            father[find(a)] = find(b);
            return ;
        }
    };

    int numIslands(vector<vector<char>>& grid) {
        int n = grid.size(), m = grid[0].size();
        UnionSet u(n * m);
        #define ind(x, y) ((x) * m + (y))
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == '1') {
                    if (i && grid[i - 1][j] == '1') u.merge(ind(i, j), ind(i - 1, j));
                    if (j && grid[i][j - 1] == '1') u.merge(ind(i, j), ind(i, j - 1));
                }
            }
        }
        int ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (grid[i][j] == '1' && u.father[ind(i, j)] == ind(i, j)) ans++;
            }
        }
        #undef ind
        return ans;
    }
};

js

class UnionSet {
    constructor(n) {
        this.father = new Array(n);
        for (var i = 0; i < n; i++) this.father[i] = i;
    }
    find(x) {
        return this.father[x] = (this.father[x] == x ? x : this.find(this.father[x]));
    }
    merge(a, b) {
        this.father[this.find(a)] = this.find(b); 
    } 
};

var numIslands = function(grid) {
    var u = new UnionSet(grid.length * grid[0].length);
    for (var i = 0; i < grid.length; i++) {
        for (var j = 0; j < grid[0].length; j++) {
            if (grid[i][j] == '1') {
                if (i && grid[i - 1][j] == '1') u.merge(i * grid[0].length + j, (i - 1) * grid[0].length + j);
                if (j && grid[i][j - 1] == '1') u.merge(i * grid[0].length + j, i * grid[0].length + j - 1);
            }
        }
    }
    var ans = 0;
    for (var i = 0; i < grid.length; i++) {
        for (var j = 0; j < grid[0].length; j++) {
            if (grid[i][j] == '1' && u.father[i * grid[0].length + j] == i * grid[0].length + j) ans++;
        }
    }
    return ans;
};