zoukankan      html  css  js  c++  java
  • Leetcode-952 Largest Component Size by Common Factor(按公因数计算最大组件大小)

    一开始想法单纯,试了试并查集+GCD,果断TLE 73

    实在想不出比O(n^2)更好的算法,所以偷瞄了大神的代码,如下

     1 #include <iostream>
     2 #include <set>
     3 #include <vector>
     4 #define _for(i,a,b) for(int i = (a);i < (b);i ++)
     5 
     6 using namespace std;
     7 
     8 const int maxn = 100039;
     9 set<int> g[maxn];
    10 vector<int> f[maxn];
    11 bool fvis[maxn] {0},gvis[maxn] {0};
    12 class Solution
    13 {
    14     public:
    15         void demo(int x,int id)
    16         {
    17             for(int i = 2;i*i <= x;i ++)
    18             {
    19                 if(!(x%i))
    20                 {
    21                     f[id].push_back(i);//factor in vector
    22                     g[i].insert(id);//index in set
    23                     while(!(x%i)) x /= i;
    24                 }
    25             }
    26             if(x>1)
    27             {
    28                 f[id].push_back(x);//factor in vector
    29                 g[x].insert(id);//index in set
    30             }
    31         }
    32         void dfs(int id,set<int> &S)
    33         {
    34             fvis[id] = true;
    35             S.insert(id);
    36             for(auto fac:f[id])
    37             {
    38                 if(gvis[fac]) continue;
    39                 gvis[fac] = true;
    40                 for(auto fidx:g[fac])
    41                 {
    42                     if(fvis[fidx]) continue;
    43                     S.insert(fidx);
    44                     dfs(fidx,S);
    45                 }
    46             }
    47         }
    48         int largestComponentSize(vector<int>& A)
    49         {
    50             _for(i,0,A.size())
    51                 demo(A[i],i);
    52             int rnt = 1;
    53             _for(i,0,A.size())
    54             {
    55                 set<int> tmp;
    56                 if(fvis[i]) continue;
    57                 dfs(i,tmp);
    58                 rnt = max(rnt,(int)tmp.size());
    59             }
    60             return rnt;
    61         }
    62 };
    63 int main()
    64 {
    65     Solution obj;
    66     vector<int> A {2,3,6,7,4,12,21,39};
    67     cout << obj.largestComponentSize(A) << endl;
    68     return 0;
    69 }

    稍微解释一下,大神搞了一个双射,f里装的都是A[i]的因子,g里装的都是因子的下标,比如g[2]里装的就都是偶数的A的元素的下标,然后dfs vector f,走一遍因子,再根据因子从set g里找下标,每找到一个下标就装到set里,这其实就是一个"集",最后看看集的大小就是组件的大小,最大的集就是最大组件的大小

  • 相关阅读:
    再谈Asp.Net页面生命周期
    多线程、方便扩展的Windows服务程序框架
    用NuGet.Server管好自家的包包
    github for Windows
    MongoVUE 15天试用期解决办法
    NET插件系统——提升系统搜索插件和启动速度的思考
    Visual Studio Ultimate 2012 RC 安装手记
    自动完成菜单
    HBase
    WCF消息可靠性于有序传递
  • 原文地址:https://www.cnblogs.com/Asurudo/p/10054548.html
Copyright © 2011-2022 走看看