C++中统计具有相同偶数和奇数元素的子数组
给定一个正整数数组。目标是在数组中找到数字的子数组,使得每个子数组都具有相同数量的偶数和奇数元素。如果数组是 { 1,2,3,4 },则子数组将是 {1,2},{2,3},{3,4},{1,2,3,4}。此类子数组的数量为 4。
让我们通过例子来理解
输入 − arr[] = {1,3,5,7,8,3,2 };
输出 − 具有相同偶数和奇数元素的子数组数量为 − 4
解释 − 子数组将是 − { 7,8 },{8,3} {3,2},{7,8,3,2}
输入 − arr[] = {2,4,6 };
输出 − 具有相同偶数和奇数元素的子数组数量为 − 0
解释 − 所有元素都是偶数。
下面程序中使用的算法如下
在这种方法中,我们将使用一个变量temp作为数组元素之间的差值(最初为0),如果arr[i]是奇数则将其加1,如果arr[i]是偶数则将其减1。当temp的值重复时,则必须存在一个子数组,其在这些索引之间具有相同数量的偶数和奇数。temp可以是正数也可以是负数。取两个哈希数组arr_1[size+1]用于正差值的频率,arr_2[size+1]用于负差值的频率。
对于每个差值temp<0,将arr_1[-temp]中的频率添加到计数中。[-(-temp)]给出一个正索引。
对于每个差值temp>0,将arr_2[temp]中的频率添加到计数中。由于相同差值的所有出现都将是子数组的一部分。将这些频率更新为1。
Arr[] = { 1,3,5,7,8,3,2 }
从0开始的Temp值 −
1,2,3,4,3,4,3 arr_1[] { 1,1,1,3,2,0,0,0 } //all differences are positive arr_2[] { 0,0,0,0,0,0,0,0 } //no difference is negative Adding arr_1[temp] to count in each iteration gives count=4.
子数组是 − { 7,8 },{8,3} {3,2},{7,8,3,2}
将初始数组作为arr[]。
函数Sub_even_odd(int arr[], int size)接受数组及其长度并返回具有相同偶数和奇数元素的子数组的数量。
将初始计数设置为0,并将变量temp设置为一个变量,当遇到奇数值时递增,当遇到偶数值时递减。
取两个数组arr_1[]和arr_2[]来存储temp的频率。arr_1[]用于temp的正值,如果整个数组都是偶数,则最多可以达到size+1。
arr_2[]用于temp的负值,如果整个数组都是偶数,则最多可以达到size+1。
使用for循环遍历arr[]。
如果arr[i] & 1==1,这意味着arr[i]是奇数。递增temp。否则递减temp。
如果temp<0,则将arr_2[]中的相应频率添加到计数中。将该频率加1。
如果temp>0,则将arr_1[]中的相应频率添加到计数中。将该频率加1。
最后,我们计算了arr[]中具有相同数量的偶数和奇数元素的子数组的数量
返回计数作为结果。
示例
#include <bits/stdc++.h> using namespace std; int Sub_even_odd(int arr[], int size){ int count = 0; int temp = 0; int arr_1[size + 1] = {0}; int arr_2[size + 1] = {0}; arr_1[0] = 1; for (int i = 0; i < size; i++){ if(arr[i] & 1 == 1) { temp++; } else { temp--; } if (temp < 0){ count += arr_2[-temp]; arr_2[-temp]++; } else{ count += arr_1[temp]; arr_1[temp]++; } } return count; } int main(){ int arr[] = {3, 4, 6, 1, 2, 4, 10, 42}; int size = sizeof(arr) / sizeof(arr[0]); cout<<"Count of subarrays with same even and odd elements are: "<<Sub_even_odd(arr, size); return 0; }
输出
如果我们运行上面的代码,它将生成以下输出:
Count of subarrays with same even and odd elements are: 4