在 C++ 中查找给定数组中子数组均值的均值


在这个问题中,我们得到一个大小为 n 的数组 arr[] 和一个整数 m。我们的任务是查找给定数组中子数组均值的均值。

代码描述 − 在这里,我们需要将数组的均值作为大小为 m 的子数组均值的均值。

让我们举个例子来理解这个问题:

输入

arr[] = {2, 5, 3, 6, 1}, m = 3

输出

3.78

解释

All subarrays of size m are {2, 5, 3}, {5, 3, 6}, {3, 6, 1}
Means of means of subarray of size m,

$$(\left(\frac{2+5+3}{3}\right)+\left(\frac{5+3+6}{3}\right)+\left(\frac{3+6+1}{3}\right))/3=\left(\frac{10}{3}\right)+\left(\frac{14}{3}\right)+\left(\frac{10}{3}\right)/3=34/3/3=3.78$$

解决方案方法

解决这个问题的一个简单方法是找到所有大小为 m 的子数组并计算它们的均值。然后将所有这些均值相加,再除以子数组的数量。并返回结果。

另一种更高效的方法是使用滑动窗口算法。我们将从索引 0 开始找到大小为 m 的窗口。对于每个窗口,找到均值并求和。最后,将总和除以窗口数量并返回该值。

程序说明了我们解决方案的工作原理:

示例

 在线演示

#include <iostream>
using namespace std;
float calcMeanOfSubarrayMeans(int arr[], int n, int m) {
   float meanSum = 0, windowSum = 0;
   for (int i = 0; i < m; i++)
      windowSum += arr[i];
      meanSum += (windowSum / m);
   for (int i = 0; i < n; i++) {
      windowSum = windowSum - arr[i - m] + arr[i];
      meanSum += (windowSum / m);
   }
   int windowCount = n - m + 1;
   return (meanSum / windowCount);
}
int main() {
   int arr[] = { 4, 1, 7, 9, 2, 5, 3};
   int n = sizeof(arr) / sizeof(arr[0]);
   int m = 3;
   cout<<"The mean of subarray means is "<<calcMeanOfSubarrayMeans(arr, n, m);
   return 0;
}

输出

The mean of subarray means is 8.06667

更新于:2021年3月12日

124 次浏览

开始您的职业生涯

完成课程获得认证

开始
广告