2
public int largestComponentSize(int[] nums) {3
int maxNum = getMaxNum(nums);4
Map<Integer, Integer> numToFirstPrimeFactor = new HashMap<>();5
DisjointSet ds = new DisjointSet(maxNum + 1);11
List<Integer> primeFactors = getPrimeFactors(num);12
int firstPrimeFactor = primeFactors.get(0);13
numToFirstPrimeFactor.put(num, firstPrimeFactor);15
for (int i = 1; i < primeFactors.size(); i++) {16
ds.union(primeFactors.get(i - 1), primeFactors.get(i));20
Map<Integer, Integer> componentToSize = new HashMap<>();22
for (int num : nums) {27
int firstPrimeFactor = numToFirstPrimeFactor.get(num);28
int component = ds.find(firstPrimeFactor);29
int size = componentToSize.getOrDefault(component, 0);30
componentToSize.put(component, ++size);31
maxSize = Math.max(maxSize, size);36
public int getMaxNum(int[] nums) {38
for (int num : nums) {39
maxNum = Math.max(maxNum, num);44
public List<Integer> getPrimeFactors(int num) {45
List<Integer> primeFactors = new ArrayList<>();47
// even prime factor i.e. 253
} while ((num & 1) == 0);58
while (num != 1 && primeFactor * primeFactor <= num) {59
if (num % primeFactor == 0) {60
primeFactors.add(primeFactor);64
} while (num % primeFactor == 0);71
primeFactors.add(num);81
public DisjointSet(int size) {84
for (int i = 0; i < size; i++) {90
public int find(int x) {91
while (x != root[x]) {92
root[x] = root[root[x]];98
public void union(int x, int y) {102
if (rootX == rootY) {106
if (rank[rootX] > rank[rootY]) {108
} else if (rank[rootX] < rank[rootY]) {