计算C ++中二进制数组中仅包含0和仅1的子数组

给我们一个数组arr [],它只包含0和1。目标是对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的子数组。以两个计数器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。

  • 我们将使用从i = 0到I <size的for循环遍历数组。

  • 如果当前元素为0,则增加count_0。

  • 如果不是,则以temp_one_0 = count *(count + 1)/ 2的形式计算count_0 number为0的所有可能的子数组。

  • 到目前为止,将其添加到先前的temp_0中以找到全0的子数组。

  • 使用变量为count_1,temp_one_1和temp_1的for循环执行类似的过程。

  • 在两次遍历结束时,temp_0和temp_1将对arr中具有全0和全1的所有子数组分别计数。

示例

#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