C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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を返す

  • return parent [x] =getParent(parent [x])

  • 関数unionn()を定義します。これには、x、y、

    が必要です。
  • parX:=getParent(x)

  • parY:=getParent(y)

  • parXがparYと同じ場合、-

    • 戻る

  • ランク[parX]>=ランク[parY]の場合、-

    • ランク[parX]:=ランク[parX]+ランク[parY]

    • parent [parY]:=parX

  • それ以外の場合

    • ランク[parY]:=ランク[parY]+ランク[parX]

    • parent [parX]:=parY

  • メインの方法から、次のようにします-

  • ret:=0、n:=Aのサイズ

  • 親:=サイズnの配列を定義しますこれを-1で埋めます

  • ランク:=サイズnの配列を定義しますこれを1で埋めます

  • 1つのマップを定義するm

  • 初期化i:=0の場合、i

    • x:=A [i]

    • 初期化j:=2の場合、j * j <=xの場合、更新(jを1増やします)、実行-

      • x mod jが0と同じ場合、&minsu;

        • jがmの場合、-

          • unionn(m [j]、i)

        • それ以外の場合

          • m [j]:=i

        • (x / j)がmの場合、-

          • unionn(m [x / j]、i)

        • それ以外の場合

          • m [x / j] =i

    • xがmの場合、-

      • unionn(m [x]、i)

    • それ以外の場合

      • m [x]:=i

    • 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

  1. C++でa+b + c=dとなるような配列で最大のdを見つけます

    整数のセットがあるとします。数「d」を見つける必要があります。ここで、d =a + b + cであり、最大化(a + b + c)する必要があり、すべてのa、b、c、およびdがセットに存在します。セットには、少なくとも1つの要素、最大で1000の要素が含まれます。各要素は有限数になります。セットが{2、3、5、7、12}の場合、12が最大です。これは2+3 + 7で表すことができます この問題を解決するために、ハッシュ手法を使用できます。 (a + b)のすべてのペアの合計をハッシュテーブルに格納し、次にすべてのペア(c、d)をトラバースし、検索(d-c)がテーブルに存在するかどうかを確認し

  2. 最長共通部分列のためのC++プログラム

    サブシーケンスは、要素のセットと同じ順序のシーケンスです。シーケンス「stuv」の場合、サブシーケンスは「stu」、「tuv」、「suv」などです。 長さnの文字列の場合、文字列からサブシーケンスを作成する方法は2nあります。 例 文字列「ABCDGH」および「AEDFHR」の最長共通部分列の長さは3です。 #include <iostream> #include <string.h> using namespace std; int max(int a, int b); int lcs(char* X, char* Y, int m, int n){