C++中统计出现次数相同的两个给定元素的子数组个数
给定一个整数数组 arr[],以及两个数字 A 和 B。目标是统计 arr[] 的所有子数组,使得 A 和 B 的出现次数在所有子数组中都相等。如果数组为 [1,2,3],A 为 1,B 为 2,则子数组将为 [3],[1,2],[1,2,3]。
让我们通过例子来理解。
输入 − arr[] = { 2, 2, 1, 1, 1, 5 }; A=1, B=5
输出 − 出现次数相同的两个给定元素的子数组个数为 − 4
解释 − 子数组将是 − [2],[2],[2,2],[1,5]。前三个子数组中 1 和 5 的出现次数为 0,最后一个子数组中两者都出现 1 次。
输入 − arr[] = { 5,3,7,5,3 }; A=1, B=2
输出 − 出现次数相同的两个给定元素的子数组个数为 − 15
解释 − 子数组将是 − (1 和 2 的出现次数为 0 的那些)
[5], [3], [7], [5], [3] - 5 [5,3], [3,7], [7,5], [5,3] - 4 [5,3,7], [3,7,5], [7,5,3] - 3 [5,3,7,5], [3,7,5,3] - 2 [5,3,5,7,5] - 1
共有 15 个子数组中 1 和 2 的出现次数为 0。
下面程序中使用的方法如下:
我们将使用两个 for 循环遍历数组以生成所有可能的子数组。从 i=0 到 i<=size-1,以及 j=i 到 j<=size-1。生成的子数组将在 arr[i] 到 arr[j] 之间。统计每个子数组中 A 和 B 的频率。如果相等,则递增计数。
取一个数字数组 arr[]。
函数 sub_EqualOccurrence(int arr[], int size, int A, int B) 获取数组并返回 A 和 B 出现次数相同的子数组的个数。
将初始计数设置为 0。
我们将使用两个 for 循环遍历数组,从 i=0 到 i<=size-1,以及 j=0 到 j<=size-1。
取两个变量 total_A、total_B 为 0,分别表示子数组 arr[i] 到 arr[j] 中 A 和 B 的个数。
将 arr[j] 与 A 和 B 进行比较。如果 arr[j] 是 A 或 B,则递增相应的计数(total_A 或 total_B)。
如果 total_A==total_B,则递增计数。(子数组中 A 和 B 的元素个数相同)。
在两个循环结束时,返回计数作为结果。
示例
#include <bits/stdc++.h> using namespace std; int sub_EqualOccurrence(int arr[], int size, int A, int B){ int count = 0; for (int i = 0; i <= size - 1; i++){ int total_A = 0; int total_B = 0; for (int j = i; j <= size - 1; j++){ if (arr[j] == A){ total_A++; } else if (arr[j] == B){ total_B++; } if(total_A == total_B){ count++; } } } return count; } // Driver code int main(){ int arr[] = { 2, 3, 1, 1, 4, 5 }; int size = sizeof(arr) / sizeof(arr[0]); int A = 1, B = 5; cout<<"Count of subarrays with equal number of occurrences of two given elements are: "<<sub_EqualOccurrence(arr, size, A, B); return (0); }
输出
如果运行以上代码,将生成以下输出:
Count of subarrays with equal number of occurrences of two given elements are: 5