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
- c [i] =2の場合、
- フラグが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, ],]
-
C++でバイナリツリーを印刷する
これらのルールに基づいて、m *n2D文字列配列に二分木を表示する必要があるとします- 行番号mは、指定された二分木の高さと同じである必要があります。 列番号nは常に奇数である必要があります。 ルートノードの値は、配置できる最初の行の真ん中に配置する必要があります。ルートノードが存在する列と行は、残りのスペースを2つの部分に分割します。これらは左下部分と右下部分です。左下の部分に左のサブツリーを印刷し、右下の部分に右のサブツリーを印刷する必要があります。ここで、左下部分と右下部分は同じサイズである必要があります。一方のサブツリーがnoneで、もう一方がnoneでない場合でも、noneサブツリ
-
C++での二分木の剪定
バイナリツリーのヘッドノードルートがあり、さらにすべてのノードの値が0または1であるとします。1を含まないすべてのサブツリーが削除された同じツリーを見つける必要があります。したがって、ツリーが次のような場合- これを解決するには、次の手順に従います- 再帰メソッドsolve()を定義します。これにより、ノードが取得されます。メソッドは次のようになります- ノードがnullの場合、nullを返します ノードの左側:=solve(ノードの左側) ノードの権利:=solve(ノードの権利) ノードの左側がnullで、ノードの右側もnullで、ノード値が0の