Most Stones Removed with Same Row or Column LeetCode solution in C++
1class Solution {2class UnionFind {3vector<int> parent, rank;45public:6int count = 0;7UnionFind(int n) {8count = n;9parent.assign(n, 0);10rank.assign(n, 0);11for (int i = 0; i < n; i++) {12parent[i] = i;13}14}15int find(int p) {16while (p != parent[p]) {17parent[p] = parent[parent[p]];18p = parent[p];19}20return p;21}22bool Union(int p, int q) {23int rootp = find(p);24int rootq = find(q);25if (rootp == rootq)26return false;27else if (rank[rootp] < rank[rootq]) {28parent[rootp] = rootq;29rank[rootq]++;30count--;31return true;32} else {33parent[rootq] = rootp;34rank[rootp]++;35count--;36return true;37}38}39};4041public:42int removeStones(vector<vector<int>> &stones) {43int n = stones.size();44UnionFind uf(n);45for (int i = 0; i < n; i++) {46for (int j = 0; j < i; j++) {47if (stones[i][0] == stones[j][0] or stones[i][1] == stones[j][1]) uf.Union(i, j);48}49}5051return n - uf.count;52}53};