Leetcode 305 Solution

This article provides solution to leetcode question 305 (number-of-islands-ii)

https://leetcode.com/problems/number-of-islands-ii

Solution

class FindAndUnionSet
{
    int* parent;
public:
    FindAndUnionSet(int size)
    {
        parent = new int[size];
        for (int i = 0; i < size; i++)
            parent[i] = i;
    }

    int Find(int i)
    {
        return parent[i] == i ? i : parent[i] = Find(parent[i]);
    }

    void Union(int i, int j)
    {
        int pi = Find(i);
        int pj = Find(j);
        parent[pj] = pi;
    }
};

class Solution {
public:
    vector<int> numIslands2(int m, int n, vector<pair<int, int>>& positions) {
        FindAndUnionSet s(m * n);

        vector<int> res;
        int last_number = 0;
        unordered_set<int> islands;
        for (auto pos : positions)
        {
            int i = pos.first;
            int j = pos.second;

            unordered_map<int, pair<int, int>> neighbors;
            if (i > 0 && islands.find((i - 1) * n + j) != islands.end())
                neighbors[s.Find((i - 1) * n + j)] = make_pair(i - 1, j);

            if (i < m - 1 && islands.find((i + 1) * n + j) != islands.end())
                neighbors[s.Find((i + 1) * n + j)] = make_pair(i + 1, j);

            if (j > 0 && islands.find(i * n + j - 1) != islands.end())
                neighbors[s.Find(i * n + j - 1)] = make_pair(i, j - 1);

            if (j < n - 1 && islands.find(i * n + j + 1) != islands.end())
                neighbors[s.Find(i * n + j + 1)] = make_pair(i, j + 1);

            if (neighbors.size() == 0)
                last_number++;
            else
            {
                last_number -= neighbors.size() - 1;
                for (auto nei : neighbors)
                    s.Union(i * n + j, nei.second.first * n + nei.second.second);
            }

            islands.insert(i * n + j);
            res.push_back(last_number);
        }

        return res;
    }
};