C++ 中统计平均数也在同一数组中的对数


给定一个整数数组,其中数组的每个元素都在范围 [-1000, 1000] 内。目标是找到数组元素的对,使得它们的平均数也在该数组中。如果数组是 arr[] = [1, 2, 3, 4]。那么对将是 (1, 3) 和 (2, 4),因为 1 和 3 的平均数是 2,2 和 4 的平均数是 3,并且 2 和 3 都存在于数组中。计数将为 2。

让我们通过示例来理解。

输入 − arr[] = { -1, 2, 5, -3, 8, 10 }

输出 − 平均数也在同一数组中的对的计数为 − 2

说明 − 满足条件的对为 − (-1, 5) 平均数为 2,(2, 8) 平均数为 5。计数 = 2

输入 − arr[] = {1, 3, 2, 5, 10, 6}

输出 − 平均数也在同一数组中的对的计数为 − 3

说明 − 满足条件的对为 − (1, 3) 平均数为 2,(1, 5) 平均数为 3,(2, 10) 平均数为 6。计数 = 3。

下面程序中使用的的方法如下

我们首先为数组的所有元素创建一个频率数组。频率数组的大小是原始数组的两倍,因为也可能存在负元素。

负数的频率将从索引 0 到索引 1000 开始。正数的频率将从索引 1000 到 2000 开始。

对于每个非零频率,执行以下操作:

  1. 将 (freq[i]) * (freq[i]-1)/2 加到计数中,因为两个相同数字的平均数就是数字本身。如果数组中有 5 个 2。那么对的总数将为 (5*(5-1))/2=10。

  2. 如果上面的 freq[i] 非零,则开始遍历交替频率,因为连续数字的平均数是浮点数,并且不会出现在数组中。

  3. 如果找到非零的 freq[j] 并且 freq[ (i+j)/2 ] 也非零。则将 freq[i]*freq[j] 加到计数中(因为每个数字都可以与其他每个数字配对)。

  • 取一个整数数组 arr[]

  • 函数 average_pair(arr, size) 获取数组及其大小,并返回满足条件的对的计数,即对中元素的平均数也在数组 arr[] 中。

  • 将初始计数设为 0,并将 N 初始化为 1000。

  • 计算频率数组的长度为 size_2=2*N+1(对于范围 [-1000 到 1000])

  • 最初将频率数组初始化为 0。

  • 填充频率数组,使得负元素的频率从 0 到 1000,正元素的频率从 1000 之后开始。为此,将 N 加到索引中。

  • 对于每个元素 arr[i],更新频率数组为 arr_freq[arr[i] + N]++;

  • 现在遍历从 i=0 到 i<size_2 的频率数组。

  • 对于每个非零频率,根据条件 1 将 (freq[i]) * (freq[i]-1)/2 加到计数中。

  • 现在由于 arr_freq[i] 非零,遍历每个交替频率。

  • 计算 temp_2 为 arr_freq[(i + j) / 2]。

  • 现在,如果 temp_2 非零且 arr_freq[j] 非零,则满足条件 3。使用乘积 (arr_freq[i] * arr_freq[j]) 更新计数;

  • 在所有迭代结束时,计数将包含此类对的总数。

  • 返回计数作为结果。

示例

 现场演示

#include <bits/stdc++.h>
using namespace std;
int average_pair(int arr[], int size_1){
   int count = 0;
   int N = 1000;
   int size_2 = (2 * N) + 1;
   int arr_freq[size_2] = { 0 };
   for (int i = 0; i < size_1; i++){
      int temp = arr[i];
      arr_freq[temp + N]++;
   }
   for (int i = 0; i < size_2; i++){
      if (arr_freq[i] > 0){
         int check = (arr_freq[i]) * (arr_freq[i] - 1);
         count += check / 2;
         for (int j = i + 2; j < 2001; j += 2){
            int temp_2 = arr_freq[(i + j) / 2];
            if (arr_freq[j] > 0 && temp_2 > 0){
               count += (arr_freq[i] * arr_freq[j]);
            }
         }
      }
   }
   return count;
}
int main(){
   int arr[] = { 2, 3, 1, 8, 9, 10 };
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"Count of pairs with average present in the same array are: "<<average_pair(arr, size);
   return 0;
}

输出

如果我们运行以上代码,它将生成以下输出:

Count of pairs with average present in the same array are: 2

更新于: 2020-12-02

223 次查看

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告