给我们一个正整数数组。目的是找到数组中数字的子数组,以使每个子数组中具有相同数量的偶数和奇数元素。如果数组是{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的值自身重复时,则必须存在一个在这些索引之间具有相同数量的偶数-奇数的子数组。温度可以为正也可以为负。取两个哈希数组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开始-
1,2,3,4,3,4,3 arr_1[] { 1,1,1,3,2,0,0,0 } //所有差异都是积极的 arr_2[] { 0,0,0,0,0,0,0,0 } //无差异为负 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 []来存储温度的频率。arr_1 []表示temp的正值,如果整个数组是偶数,则最大为size + 1。
arr_2 []用于temp的负值,如果整个数组是偶数,则最大为size + 1。
使用for循环遍历arr []。
如果arr [i]&1 == 1,则意味着arr [i]为奇数。增量温度 否则递减温度。
如果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