C ++中因公因数最大的组件大小
假设我们有一个唯一的正整数数组A,现在考虑下图-
节点数为A,长度为A [0]至A [A-1的大小];当A [i]和A [j]的公因子大于1时,在A [i]和A [j]之间存在一条边。我们必须找到图中最大的连接组件的大小。
因此,如果输入类似于[4,6,15,35],则输出将为4
为了解决这个问题,我们将遵循以下步骤-
定义一个父数组
定义数组等级
定义数组等级
如果parent [x]与-1相同,则-
返回x
返回parent [x] = getParent(parent [x])
定义一个函数
unionn()
,它将取x,y,parX:= getParent(x)
parY:= getParent(y)
如果parX与parY相同,则-
返回
如果rank [parX]> = rank [parY],则-
等级[parX]:=等级[parX] +等级[parY]
parent [parY]:= parX
除此以外
等级[parY]:=等级[parY] +等级[parX]
parent [parX]:= parY
从主要方法中执行以下操作-
ret:= 0,n:= A的大小
parent:=定义一个大小为n的数组,用-1填充
rank:=定义一个大小为n的数组,用1填充
定义一张映射
对于初始化i:= 0,当i <n时,更新(将i增加1),执行-
m [x]:= i
unionn(m [x],i)
如果x mod j与0相同,则&minsu;
m [x / j] = i
unionn(m [x / j],i)
m [j]:= i
unionn(m [j],i)
如果j在m中,则-
除此以外
如果(x / j)以m为单位,则-
除此以外
x:= A [i]
对于初始化j:= 2,当j * j <= x时,更新(将j增加1),执行-
如果x以m为单位,则-
除此以外
ret:= ret和rank的最大值[getParent(i)]
返回ret
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>using namespace std;
class Solution {
public:
vector<int> parent;
vector<int> rank;
int getParent(int x){
if (parent[x] == -1)
return x;
return parent[x] = getParent(parent[x]);
}
void unionn(int x, int y){
int parX = getParent(x);
int parY = getParent(y);
if (parX == parY)
return;
if (rank[parX] >= rank[parY]) {
rank[parX] += rank[parY];
parent[parY] = parX;
} else {
rank[parY] += rank[parX];
parent[parX] = parY;
}
}
int largestComponentSize(vector<int>& A) {
int ret = 0;
int n = A.size();
parent = vector<int>(n, -1);
rank = vector<int>(n, 1);
unordered_map<int, int> m;
for (int i = 0; i < n; i++) {
int x = A[i];
for (int j = 2; j * j <= x; j++) {
if (x % j == 0) {
if (m.count(j)) {
unionn(m[j], i);
} else {
m[j] = i;
}
if (m.count(x / j)) {
unionn(m[x / j], i);
} else {
m[x / j] = i;
}
}
}
if (m.count(x)) {
unionn(m[x], i);
} else {
m[x] = i;
}
ret = max(ret, rank[getParent(i)]);
}
return ret;
}
};
main(){
Solution ob;
vector<int> v = {4,6,15,35};
cout << (ob.largestComponentSize(v));
}
输入值
{4,6,15,35}
输出结果
4
以上是 C ++中因公因数最大的组件大小 的全部内容, 来源链接: utcz.com/z/335194.html