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

C++で最小の共通領域


各リストの最初のリージョンにそのリスト内の他のすべてのリージョンが含まれているリージョンのリストがあるとします。基本的に、領域Xに別の領域Yが含まれている場合、XはYよりも大きくなります。また、定義上、領域Xにはそれ自体が含まれます。したがって、2つの領域r1とr2がある場合、両方を含む最小の領域を見つける必要があります。したがって、r1にr3が含まれるようなr1、r2、およびr3がある場合、r2にr3が含まれるようなr2がないことが保証されます。したがって、入力が[["Earth"、 "North America"、 "South America"]、["North America"、 "United States"、 "Canada"]、["United States"、 "New York"、 "Boston"]、["Canada"、 "Ontario"、 "Quebec"]、["South America"、 "Brazil"]]、およびr1='Quebec'およびr2='NewYork'の場合、出力は次のようになります。 「北米」

これを解決するには、次の手順に従います-

  • 親と呼ばれる地図を作成する
  • 0からrのサイズまでの範囲のiの場合
    • 範囲1からr[i]のサイズのjの場合
      • 親[r[i、j]]:=r [i、0]
  • チェーンと呼ばれる1つのセットを作成し、xをチェーンに挿入します
  • xが親にある間、
    • x:=parent [x]
    • xをチェーンに挿入
  • yがチェーンに存在する間
    • y:=parent [y]
  • yを返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string findSmallestRegion(vector<vector<string>>& r, string x, string y) {
      map < string, string> parent;
      for(int i = 0; i < r.size(); i++){
         for(int j = 1; j < r[i].size(); j++){
            parent[r[i][j]] = r[i][0];
         }
      }
      set <string> chain;
      chain.insert(x);
      while(parent.find(x)!=parent.end()){
         x = parent[x];
         chain.insert(x);
      }
      while(chain.find(y)==chain.end()){
         y = parent[y];
      }
      return y;
   }
};
main(){
   vector<vector<string>> v = {
      {"Earth","North America","South America"},
      {"North America","United States","Canada"},
      {"United States","New York","Boston"},  
      {"Canada","Ontario","Quebec"},{"South America","Brazil"}
   };
   Solution ob;
   cout << (ob.findSmallestRegion(v, "Quebec", "New York"));
}

入力

[["Earth","North America","South America"],["North America","United States","Canada"],
["United States","New York","Boston"],["Canada","Ontario","Quebec"],["South America","Brazil"]]
"Quebec"
"New York"

出力

North America

  1. C++でスワップする最小の文字列

    文字列sと、文字列ペア内のインデックスのペアの配列を指定したとします。ここで、pairs [i] =[a、b]は、文字列の2つのインデックス(0-インデックス)を示します。指定されたペアのインデックスの任意のペアで、必要に応じて何度でも文字を交換できます。スワップを使用した後にsを変更できる辞書式最小の文字列を見つける必要があります。したがって、入力がs =“ dcab”およびpairs =[[0,3]、[1,2]]のような場合、出力は“ bacd”になります。 s[0]とs[3]、s =bcadを交換してから、s[1]とs[2]、s=bacdを交換します。 これを解決するには、次の手順に従

  2. C++のすべての行で最小の共通要素を検索する

    すべての行が降順ではない順序で並べ替えられるマトリックスマットがあるとすると、すべての行で最小の共通要素を見つける必要があります。共通の要素がない場合は、-1を返します。したがって、行列が-のような場合 1 2 3 4 5 2 4 5 8 10 3 5 7 9 11 1 3 5 7 9 出力は5になります これを解決するには、次の手順に従います- マップm、n:=行列の行数を定義します nが0でない場合、x =列サイズ、それ以外の場合は0 0からn–1の範囲のiの場合