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

更新于:2020年12月1日

339 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告