数组中范围平均值的Java程序
给定一个包含 n 个整数的数组。给你 q 个查询。编写一个程序,在新行中为每个查询打印从 l 到 r 范围内的均值的下限值。
例子 :
Input : arr[] = {1, 2, 3, 4, 5}
q = 3
0 2
1 3
0 4
Output : 2
3
3
Here for 0 to 2 (1 + 2 + 3) / 3 = 2
Input : arr[] = {6, 7, 8, 10}
q = 2
0 3
1 2
Output : 7
7
天真的方法:我们可以为每个查询 l 到 r 运行循环,并找到范围内元素的总和和数量。在此之后,我们可以打印每个查询的均值下限。
Java
// Java program to find floor value
// of mean in range l to r
public class Main {
// To find mean of range in l to r
static int findMean(int arr[], int l, int r)
{
// Both sum and count are
// initialize to 0
int sum = 0, count = 0;
// To calculate sum and number
// of elements in range l to r
for (int i = l; i <= r; i++) {
sum += arr[i];
count++;
}
// Calculate floor value of mean
int mean = (int)Math.floor(sum / count);
// Returns mean of array
// in range l to r
return mean;
}
// Driver program to test findMean()
public static void main(String[] args)
{
int arr[] = { 1, 2, 3, 4, 5 };
System.out.println(findMean(arr, 0, 2));
System.out.println(findMean(arr, 1, 3));
System.out.println(findMean(arr, 0, 4));
}
}
Java
// Java program to find floor value
// of mean in range l to r
public class Main {
public static final int MAX = 1000005;
static int prefixSum[] = new int[MAX];
// To calculate prefixSum of array
static void calculatePrefixSum(int arr[], int n)
{
// Calculate prefix sum of array
prefixSum[0] = arr[0];
for (int i = 1; i < n; i++)
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
// To return floor of mean
// in range l to r
static int findMean(int l, int r)
{
if (l == 0)
return (int)Math.floor(prefixSum[r] / (r + 1));
// Sum of elements in range l to
// r is prefixSum[r] - prefixSum[l-1]
// Number of elements in range
// l to r is r - l + 1
return (int)Math.floor((prefixSum[r] -
prefixSum[l - 1]) / (r - l + 1));
}
// Driver program to test above functions
public static void main(String[] args)
{
int arr[] = { 1, 2, 3, 4, 5 };
int n = arr.length;
calculatePrefixSum(arr, n);
System.out.println(findMean(1, 2));
System.out.println(findMean(1, 3));
System.out.println(findMean(1, 4));
}
}
输出 :
2
3
3
时间复杂度: O(n)
有效方法:我们可以使用前缀求和的数字来找到数字的总和。 prefixSum[i] 表示前 i 个元素的总和。因此,从 l 到 r 范围内的数字总和将是 prefixSum[r] – prefixSum[l-1]。 l 到 r 范围内的元素数将为 r – l + 1。所以我们现在可以在 O(1) 中打印范围 l 到 r 的平均值。
Java
// Java program to find floor value
// of mean in range l to r
public class Main {
public static final int MAX = 1000005;
static int prefixSum[] = new int[MAX];
// To calculate prefixSum of array
static void calculatePrefixSum(int arr[], int n)
{
// Calculate prefix sum of array
prefixSum[0] = arr[0];
for (int i = 1; i < n; i++)
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
// To return floor of mean
// in range l to r
static int findMean(int l, int r)
{
if (l == 0)
return (int)Math.floor(prefixSum[r] / (r + 1));
// Sum of elements in range l to
// r is prefixSum[r] - prefixSum[l-1]
// Number of elements in range
// l to r is r - l + 1
return (int)Math.floor((prefixSum[r] -
prefixSum[l - 1]) / (r - l + 1));
}
// Driver program to test above functions
public static void main(String[] args)
{
int arr[] = { 1, 2, 3, 4, 5 };
int n = arr.length;
calculatePrefixSum(arr, n);
System.out.println(findMean(1, 2));
System.out.println(findMean(1, 3));
System.out.println(findMean(1, 4));
}
}
输出:
2
3
3
有关更多详细信息,请参阅有关数组范围平均值的完整文章!