在 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
广告