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

C++のバイナリ配列で0と1のみで構成されるサブ配列をカウントします


0と1のみを含む配列arr[]が与えられます。目標は、arr []のすべてのサブ配列をカウントして、各サブ配列に0のみ、または1のみが含まれるようにすることです。配列が[1,0,0]の場合、サブ配列は0のみ[0]、[0]、[0,0]、および1のみ[1]になります。

例を挙げて理解しましょう。

入力 − arr [] ={0、0、1、1、1、0};

出力 − 0のみのサブアレイは:4 1のみのサブアレイは:6

説明 − Subaaraysは−

For all 0’s: [0], [0], [0], [0,0]. Total 4 ( arr[0], arr[1], arr[5], arr[0-1] )
For all 1’s: [1], [1], [1], [1,1], [1,1], [1,1,1]. Total 6 ( arr[2], arr[2], arr[4], arr[2-3], arr[3-4],
arr[2-4] )

入力 − arr [] ={1,0,1,0};

出力 − 0のみのサブアレイは:2 1のみのサブアレイは:2

説明 − Subaaraysは−

For all 0’s: [0], [0]. Total 2 ( arr[1], arr[3] )
For all 1’s: [1], [1]. Total 2 ( arr[0], arr[2] )

以下のプログラムで使用されているアプローチは次のとおりです

0と1のみのサブ配列を個別にカウントするために、配列を2回トラバースします。 2つのカウンターcount_0とcount_1を取り、配列内の連続する0と1のカウントを格納します。そのようなカウントごとに、可能なサブ配列はcount_0 *(count_0 + 1)/ 2であり、count_1についても同様です。

配列の最後に到達するまで、これをtotal_0カウントに追加します。 1についても同様のプロセスを実行します。

  • 数字の配列arr[]を取ります。

  • 関数sub_zero_one(int arr []、int size)は配列を受け取り、0のみのサブ配列の数と1のみのサブ配列の数を返します。

  • サブアレイの初期カウントをtemp_0およびtemp_1とします。

  • 0と1の一時的な連続カウントをcount_0とcount_1として取ります。

  • forループを使用してi=0からI

  • 現在の要素が0インクリメントcount_0の場合。

  • そうでない場合は、count_0の数が0のすべての可能なサブ配列をtemp_one_0 =count *(count + 1)/2として計算します。

  • これを、これまでにすべて0が見つかったサブアレイの以前のtemp_0に追加します。

  • count_1、temp_one_1、temp_1などの変数を使用してforループfor1を使用して同様のプロセスを実行します。

  • 両方のトラバーサルの終了時に、temp_0とtemp_1には、すべて0とすべて1を持つarr内のすべてのサブ配列のそれぞれのカウントがあります。

#include <bits/stdc++.h>
using namespace std;
void sub_zero_one(int arr[], int size){
   int count_1 = 0;
   int count_0 = 0;
   int temp_1 = 0;
   int temp_0 = 0;
   for (int i = 0; i < size; i++){
      if (arr[i] == 1){
         count_1++;
      }
      else{
         int temp_one_1 = (count_1) * (count_1 + 1) / 2;
         temp_1 = temp_1 + temp_one_1;
         count_1 = 0;
      }
   }
   for (int i = 0; i < size; i++){
      if (arr[i] == 0)
         { count_0++; }
      else{
         int temp_one_0 = (count_0) * (count_0 + 1) / 2;
         temp_0 = temp_0 + temp_one_0;
         count_0 = 0;
      }
   }
   if (count_1){
      int temp_one_1 = (count_1) * (count_1 + 1) / 2;
      temp_1 = temp_1 + temp_one_1;
   }
   if (count_0){
      int temp_one_0 = (count_0) * (count_0 + 1) / 2;
      temp_0 = temp_0 + temp_one_0;
   }
   cout<<"Subarrays with only 0's are : "<<temp_0;
   cout<<"\nSubarrays with only 1's are : "<<temp_1;
}
int main(){
   int arr[] = { 0, 0, 0, 1, 1, 0, 1};
   int size = sizeof(arr) / sizeof(arr[0]);
   sub_zero_one(arr, size);
   return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます-

Subarrays with only 0's are : 7
Subarrays with only 1's are : 4

  1. C ++のバイナリツリー(反復および再帰)の完全なノードをカウントします

    バイナリツリーが与えられ、タスクは、反復的かつ再帰的なアプローチを使用して、バイナリツリーで使用可能な完全なノードの数を計算することです。フルノードとは、両方の子があり、子がnullでないノードです。フルノードでは、正確に2つの子を持つノードを考慮することに注意してください。 バイナリツリーは、データストレージの目的で使用される特別なデータ構造です。二分木には、各ノードが最大2つの子を持つことができるという特別な条件があります。バイナリツリーには、検索が並べ替えられた配列と同じくらい高速であり、挿入または削除操作がリンクリストと同じくらい高速であるため、順序付き配列とリンクリストの両方の利点

  2. C ++のバイナリツリー(反復および再帰)のハーフノードをカウントします

    バイナリツリーが与えられ、タスクは、反復的かつ再帰的なアプローチを使用して、バイナリツリーで使用可能なハーフノードの数を計算することです。ハーフノードは、子が1つだけで、もう1つの子がnullであるノードです。ハーフノードでは、リーフノードを考慮しないことに注意してください。 バイナリツリーは、データストレージの目的で使用される特別なデータ構造です。二分木には、各ノードが最大2つの子を持つことができるという特別な条件があります。バイナリツリーには、検索が並べ替えられた配列と同じくらい高速であり、挿入または削除操作がリンクリストと同じくらい高速であるため、順序付き配列とリンクリストの両方の利点