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

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

  1. 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では

  2. C++での二分木の最小の深さ

    二分木があるとしましょう。その木の最小の深さを見つけなければなりません。最小の深さは、ルートノードから最も近いリーフノードまでの最短パスに沿ったノードの数です。 したがって、入力が次のような場合 その場合、出力は2になります これを解決するには、次の手順に従います- ツリーノードの配列aaを定義する aaの最後にルートを挿入します ツリーノードの別の配列akを定義します レベル:=0 ルートがnullの場合、- 0を返す aaのサイズが0に等しくない場合は、-を実行します。 配列akをクリアします (レベルを1上げます)