给定一个由不同正整数的组成的非空数组 A,考虑下面的图:
有 A.length 个节点,按从 A[0] 到 A[A.length - 1] 标记;
只有当 A[i] 和 A[j] 共用一个大于 1 的公因数时,A[i] 和 A[j] 之间才有一条边。
返回图中最大连通组件的大小。
示例 1:
1 <= A.length <= 20000
1 <= A[i] <= 100000
class Solution {
public:
vector<int> fa;
void merge(int p, int q) {
int pID = find(p), qID = find(q);
if (pID != qID)
fa[pID] = qID;
}
int find(int p) {
while (p != fa[p]) {
p = fa[p];
fa[p] = fa[fa[p]];
}
return p;
}
int largestComponentSize(vector<int>& A) {
int ma = *max_element(A.begin(), A.end());
fa.resize(ma+1);
for (int i = 1; i <= ma; i++) fa[i] = i;
for (int n : A)
for (int i = 2; i <= n/i; i++) {
if (n % i == 0) {
merge(n, i);
if (i != n/i)
merge(n, n/i);
}
}
vector<int> cnt(ma+1, 0);
int ans = 0;
for (int n : A) {
int f = find(n);
cnt[f]++;
if (cnt[f] > ans) ans = cnt[f];
}
return ans;
}
};
复杂度分析
不太懂为什么要和质数联系在一起
复杂度分析