计算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

说明-Subaarays将是-[2],[2],[2,2],[1,5]。前三个具有0出现的1和5,最后一个具有1出现两个。

输入− arr [] = {5,3,7,5,3}; A = 1,B = 2

输出-等于数量的子数组的数量 给定两个元素的出现是-15

说明-Subaarays将是-(0次出现1和2)

[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)获取数组,并返回等于no的子数组的数量。A和B。

  • 将初始计数设为0。

  • 我们将使用两个for循环遍历数组,这些循环从i = 0到i <= size-1,从j = 0到j <= size-1。

  • 对于子数组arr [i]至arr [j]中的A和B的数目,将两个变量total_A,total_B设为0。

  • 将arr [j]与A和B进行比较。如果arr [j]为A或B,则增加各自的计数(total_A或total_B)。

  • 如果total_A == total_B。增量计数。(子数组具有与元素相同的A和B数)。

  • 在两个循环的最后,返回count作为结果。

示例

#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;
}
//驱动程式码
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