Untitled

 avatar
unknown
c_cpp
2 years ago
1.5 kB
7
Indexable
class Solution {
public:
    unordered_map<int, int>parent;
    int find(int a){
        return parent[a] == a?a:parent[a] = find(parent[a]);
    }
    int combine(int a, int b){
        int pa = find(a), pb = find(b);
        if(pa == pb)
            return 0;
        parent[pa] = pb;
        return 1;
    }
    vector<int> numIslands2(int m, int n, vector<vector<int>>& positions) {
        vector<int>ans;
        int comp = 0;
        int row_dir[2] = {1, -1};//Move in the same row
        int col_dir[2] = {n, -n};//Move in the same column
        for(auto p: positions){
            int coord = p[0]*n+p[1];
            if(parent.count(coord)){//Already exists
                ans.push_back(comp);
                continue;
            }
            comp++;
            parent[coord] = coord;
            for(int i = 0; i < 2; i++){
                int new_coord = coord+row_dir[i];
                if(new_coord/n != coord/n)//Not in the same row
                    continue;             //Avoid the flaw of using single num
                if(parent.count(new_coord))
                    comp -= combine(coord, new_coord);
            }
            for(int i = 0; i < 2; i++){
                int new_coord = coord+col_dir[i];
                if(parent.count(new_coord))
                    comp -= combine(coord, new_coord);
            }
            ans.push_back(comp);
        }
        return ans;
    }
    //Time O(m*n)
    //Space O(m*n)
};
Editor is loading...
Leave a Comment