題目描述: 給定一個正整數陣列 nums,如果 nums[i] 和 nums[j] 有大於 1 的公因數,就在它們之間連一條邊。求最大連通分量的大小。
解題思路:
時間複雜度:O(n * sqrt(M) * α(M)) — n 為陣列長度,M 為最大值。每個數字的質因數分解 O(sqrt(M)),Union-Find 操作近乎 O(1)
空間複雜度:O(M) — Union-Find 陣列大小為最大值 M
1. Initialize Union-Find with size = max(nums) + 1 2. For each number in nums: a. Find all prime factors by trial division up to sqrt(num) b. Unite(num, factor) for each prime factor c. Also unite(num, num/factor) for the complementary factor 3. Count how many nums share the same root in Union-Find 4. Return the maximum count
Sieve + Union-Find:用類似埃拉托斯特尼篩法的方式,對每個質數 p,將所有陣列中 p 的倍數合併。避免了逐個質因數分解的開銷。
建圖 + DFS/BFS:顯式地對共享因數的數字建邊,然後用 DFS/BFS 找連通分量。但建邊可能需要 O(n^2) 時間,且邊數可能爆炸。