给我们一个数组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