分析:最大公因数不为一的可以交换,而交换具有传递性。a和b可以交换,b和c可以交换则a和c也能交换。所以可交换的集合符合并查集性质。因为遍历n的平方合并会超时,可以采用分解质因数并合并根据公因数。
const int N = 1e5+10;
class Solution {
private:
int f[N];
public:
int find (int u)
{
if (u!=f[u]) f[u]=find(f[u]);
return f[u];
}
void merge(int a,int b)
{
int x = find(a),y = find(b);
if (x==y) return;
f[x] = y;
}
bool gcdSort(vector<int>& nums) {
vector<int> mh(nums);
sort (mh.begin(),mh.end());
for (int i=0;i<N;i++) f[i] = i;
for (int x:nums)
{
int k = x;
for (int i=2;i<=k/i;i++)
{
if (k%i==0)
{
while (k%i==0) k/=i;
merge(x,i);
}
}
if (k>1) merge(x,k);
}
for (int i=0;i<nums.size();i++)
{
if (nums[i]==mh[i]) continue;
if (find(nums[i])!=find(mh[i])) return false;
}
return true;
}
};