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

C++で2行のバイナリ行列を再構築します


n列と2行の行列の次の詳細があるとします-

  • 行列要素は0または1のいずれかになります
  • 0番目(上)の行の要素の合計は上に示されます。
  • 1番目(下)の行の要素の合計は下に示されます。
  • i番目の列(0インデックス)の要素の合計はcolsum [i]です。ここで、colsumは長さnの整数配列として指定されます。

タスクは、upper、lower、colsumで行列を再構築することです。 2D整数配列として見つける必要があります。有効な解決策が複数ある場合は、それらのいずれかが受け入れられます。有効な解決策がない場合は、空の2D配列を返します。したがって、入力がupper =2、lower =3で、colsumが[1,1,1]の場合、出力は[[1,1,0]、[0,0,1]]

になります。

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

  • フラグを設定:=true、n:=cのサイズ、1つの配列を2次のansにする* n
  • 0からnの範囲のiの場合
    • c [i] =2の場合、
      • uとlを1つ減らします
      • u<0またはl<0の場合、フラグ:=false
      • ans [0、i] =1およびans[1、i]=1を入力
    • それ以外の場合、c [i] =1の場合、
      • u> lの場合、uを1減らし、ans [0、i]:=1
      • それ以外の場合、u 減らします。
      • それ以外の場合、c [i]=1の場合
      • u> 0の場合、uを1減らし、ans [0、i]:=1
      • それ以外の場合はl>0、次にlを1減らし、ans [1、i]:=1
      • それ以外の場合はフラグを設定します:=false
    • それ以外の場合、c [i] =0
      • c [i]> 0の場合、フラグを設定します:=false
    • それ以外の場合はフラグを設定します:=false
  • フラグがfalse、uが0でない、またはlが0​​でない場合は、空を返します
  • 回答を返す

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<auto> > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<vector<int>> reconstructMatrix(int u, int l, vector<int>& c) {
      bool flag = true;
      int n = c.size();
      vector < vector <int> > ans(2, vector <int> (n));
      for(int i = 0; i < n; i++){
         if(c[i] == 2){
            u--;
            l--;
            if(u<0 || l<0)flag = false;
            ans[0][i] = 1;
            ans[1][i] = 1;
         }else if(c[i] == 1){
            if(u>l){
                  u--;
                  ans[0][i] = 1;
            }else if(u<l){
               l--;
               ans[1][i] = 1;
            }else{
               if(u>0){
                  u--;
                  ans[0][i] = 1;
               }else if(l > 0){
                  l--;
                  ans[1][i] = 1;
               }else
                  flag = false;
            }  
         }else if(c[i] == 0){
         if(c[i]>0)flag = false;
         }else{
            flag = false;
         }
      }
      if(!flag || u!=0 ||l!=0 )return {};
      return ans;
   }
};
main(){
   vector<int> v = {1,1,1};
   Solution ob;
   print_vector(ob.reconstructMatrix(2,1,v));
}

入力

2
1
[1,1,1]

出力

[[1, 1, 0, ],[0, 0, 1, ],]

  1. C++でバイナリツリーを印刷する

    これらのルールに基づいて、m *n2D文字列配列に二分木を表示する必要があるとします- 行番号mは、指定された二分木の高さと同じである必要があります。 列番号nは常に奇数である必要があります。 ルートノードの値は、配置できる最初の行の真ん中に配置する必要があります。ルートノードが存在する列と行は、残りのスペースを2つの部分に分割します。これらは左下部分と右下部分です。左下の部分に左のサブツリーを印刷し、右下の部分に右のサブツリーを印刷する必要があります。ここで、左下部分と右下部分は同じサイズである必要があります。一方のサブツリーがnoneで、もう一方がnoneでない場合でも、noneサブツリ

  2. C++での二分木の剪定

    バイナリツリーのヘッドノードルートがあり、さらにすべてのノードの値が0または1であるとします。1を含まないすべてのサブツリーが削除された同じツリーを見つける必要があります。したがって、ツリーが次のような場合- これを解決するには、次の手順に従います- 再帰メソッドsolve()を定義します。これにより、ノードが取得されます。メソッドは次のようになります- ノードがnullの場合、nullを返します ノードの左側:=solve(ノードの左側) ノードの権利:=solve(ノードの権利) ノードの左側がnullで、ノードの右側もnullで、ノード値が0の