class DisjointSet { vector<int> rank, parent, size; public: DisjointSet(int n) { rank.resize(n + 1, 0); parent.resize(n + 1); size.resize(n + 1, 1); for (int i = 0; i <= n; i++) { parent[i] = i; } } int findUPar(int node) { if (node == parent[node]) return node; return parent[node] = findUPar(parent[node]); // Path compression } void unionByRank(int u, int v) { int pu = findUPar(u); int pv = findUPar(v); if (pu == pv) return; if (rank[pu] < rank[pv]) { parent[pu] = pv; } else if (rank[pv] < rank[pu]) { parent[pv] = pu; } else { parent[pv] = pu; rank[pu]++; } } void unionBySize(int u, int v) { int pu = findUPar(u); int pv = findUPar(v); if (pu == pv) return; if (size[pu] < size[pv]) { parent[pu] = pv; size[pv] += size[pu]; } else { parent[pv] = pu; size[pu] += size[pv]; } } }; class Solution { public: vector<int> sp(int n) { vector<int> spf(n + 1); for (int i = 0; i <= n; ++i) spf[i] = i; for (int i = 2; i * i <= n; ++i) { if (spf[i] == i) { for (int j = i * i; j <= n; j += i) { if (spf[j] == j) spf[j] = i; } } } return spf; } vector<int> fac(int x, vector<int>& spf) { vector<int> f; while (x > 1) { int p = spf[x]; f.push_back(p); while (x % p == 0) x /= p; } return f; } int largestComponentSize(vector<int>& nums) { int n = nums.size(); int maxNum = *max_element(nums.begin(), nums.end()); vector<int> spf = sp(maxNum); DisjointSet ds(maxNum + 1); for (int num : nums) { vector<int> primes = fac(num, spf); for (int prime : primes) { ds.unionBySize(num, prime); // Union by size } } unordered_map<int, int> cnt; int maxSize = 0; for (int num : nums) { int root = ds.findUPar(num); cnt[root]++; maxSize = max(maxSize, cnt[root]); } return maxSize; } };
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter