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 开始。
对于每个非零频率,执行以下操作:
将 (freq[i]) * (freq[i]-1)/2 加到计数中,因为两个相同数字的平均数就是数字本身。如果数组中有 5 个 2。那么对的总数将为 (5*(5-1))/2=10。
如果上面的 freq[i] 非零,则开始遍历交替频率,因为连续数字的平均数是浮点数,并且不会出现在数组中。
如果找到非零的 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