在这个问题中,我们得到了一个由n个整数和一些m个查询组成的数组。我们的任务是创建一个程序来计算查询所给出范围的平均值的整数值(向下舍入)。
让我们举个例子来了解这个问题,
输入-
array = {5, 7, 8, 9, 10} m = 2; [0, 3], [2, 4]
输出-
7 9
为了解决这个问题,我们有两种方法,一种是直接方法,另一种是使用前缀和。
在直接方法中,对于每个查询,我们将从范围的开始索引到结束索引循环。然后将数组的所有整数相加并除以计数。这种方法可以很好地工作并打印结果,但不是有效的方法。
在这种方法中,我们将计算前缀求和数组,该数组将存储该数组所有元素的和直到第i个索引,即prefixSum(4)是直到索引4的所有元素的和。
现在,使用这个prefixSum数组,我们将使用公式计算每个查询的平均值,
Mean = prefixSum[upper] - prefixSum(lower-1) / upper-lower+1
上和下是查询中给定的索引。如果lower = 0,则prefixSum(lower-1)= 0。
该程序说明了我们解决方案的工作原理,
#include <iostream> #define MAX 100 using namespace std; int prefixSum[MAX]; void initialisePrefixSum(int arr[], int n) { prefixSum[0] = arr[0]; for (int i = 1; i < n; i++) prefixSum[i] = prefixSum[i - 1] + arr[i]; } int queryMean(int l, int r) { int mean; if (l == 0) mean =(prefixSum[r]/(r+1)); else mean =((prefixSum[r] - prefixSum[l - 1]) / (r - l + 1)); return mean; } int main() { int arr[] = {5, 7, 8, 9, 10 }; int n = sizeof(arr) / sizeof(arr[0]); initialisePrefixSum(arr, n); cout<<"Mean in 1st query: "<<queryMean(1, 4)<<endl; cout<<"Mean in 2st query: "<<queryMean(2, 4)<<endl; return 0; }
输出结果
Mean in 1st query: 8 Mean in 2st query: 9