C ++で最初に0、次に1になるように、バイナリ配列を分割するための最小トグル
問題の説明
0と1のみを含むn個の整数の配列が与えられた場合、配列がパーティション化される、つまり最初に0、次に1になるように、必要な最小のトグル(0から1に、またはその逆に切り替える)を見つけます。
例
arr [] ={1、0、0、1、1、1、0}の場合、2つのトグルが必要です。つまり、最初の1つと最後のゼロをトグルします。
アルゴリズム
- 質問を観察すると、0からn-1までのポイントが確実に存在し、そのポイントまでのすべての要素にすべて0が含まれ、右からポイントにすべて1が含まれる必要があることがわかります。
- この法律に従わないインデックスは削除する必要があります。アイデアは、すべての0を左から右に数えることです。
例
#include <bits/stdc++.h> using namespace std; int getMinToggles(int *arr, int n) { int zeroCnt[n + 1] = {0}; for (int i = 1; i <= n; ++i) { if (arr[i - 1] == 0) { zeroCnt[i] = zeroCnt[i - 1] + 1; } else { zeroCnt[i] = zeroCnt[i - 1]; } } int result = n; for (int i = 1; i <= n; ++i) { result = min(result, i - zeroCnt[i] + zeroCnt[n] - zeroCnt[i]); } return result; } int main() { int arr[] = {1, 0, 0, 1, 1, 1, 0}; int n = sizeof(arr) / sizeof(arr[0]); cout << "Minimum toggles = " << getMinToggles(arr, n) << endl; return 0; }
上記のプログラムをコンパイルして実行する場合。次の出力を生成します-
出力
Minimum toggles = 2
-
C++で最小の合計を持つツリーレベルを見つけるプログラム
二分木があり、そのルートのレベルが1、子のレベルが2などであると仮定します。レベルXのノードのすべての値の合計が最小になるように、最小のレベルXを見つける必要があります。したがって、ツリーが次のような場合- 合計が4– 10 =-6であるため、出力は2になります。これは最小です。 これを解決するには、次の手順に従います- level:=1、sum:=rの値、ansLevel:=level、ansSum:=sum キューqを定義し、指定されたノードrをqに挿入します qが空ではない間 容量:=qのサイズ レベルを1増やし、合計:=0 容量が0では
-
C++での二分木の最小の深さ
二分木があるとしましょう。その木の最小の深さを見つけなければなりません。最小の深さは、ルートノードから最も近いリーフノードまでの最短パスに沿ったノードの数です。 したがって、入力が次のような場合 その場合、出力は2になります これを解決するには、次の手順に従います- ツリーノードの配列aaを定義する aaの最後にルートを挿入します ツリーノードの別の配列akを定義します レベル:=0 ルートがnullの場合、- 0を返す aaのサイズが0に等しくない場合は、-を実行します。 配列akをクリアします (レベルを1上げます)