给定一个包含“N”个数字和一个整数“K”的列表。任务是在每次查询后打印最大“K”个数字的平均值,其中查询由一个需要添加到元素列表中的整数元素组成。
注意:查询是用整数数组 ‘q’ 定义的
例子:
Input: N = 4, K = 3, arr = {1, 2, 3, 4}, q = {7, 2, 1, 5}
Output: 4.666666
4.666666
4.666666
5.333333
After query 1, arr = {1, 2, 3, 4, 7} and the average of max K (i.e. {3, 4, 7}) elements is 4.666666.
After query 2, arr = {1, 2, 3, 4, 7, 2} and the average is 4.666666 for {3, 4, 7}.
After query 3, arr = {1, 2, 3, 4, 7, 2, 1} and the average is 4.666666 for {3, 4, 7}.
After query 4, arr = {1, 2, 3, 4, 7, 2, 5} and the average is 5.333333 for {4, 5, 7}.
Input: N = 5, K = 4, arr = {1, 2, 2, 3, 3}, q = {2, 5, 1}
Output: 2.5
3.25
3.25
方法:堆(最小堆)数据结构可用于解决此类问题,其中元素的插入和删除可以在 O(log n) 时间内执行。
- 最初,将给定元素列表中的最大 k 个元素存储在最小堆中。
- 如果传入元素小于或等于当前位于最小堆根部的元素,则丢弃该元素,因为它对平均值没有影响。
- 否则,如果该数字大于根元素,则删除最小堆的根,然后插入新元素,然后计算当前堆中元素的平均值。
- 打印平均值并为所有传入元素重复上述两个步骤。
下面是上述方法的实现:
// Java implementation of the approach
import java.util.*;
class GFG {
// Function that returns the
// average of max k elements in
// the list after each query
static void max_average_k_numbers(int n,
int k,
int m,
int[] arr,
int[] query)
{
double max_avg = 0.0;
// min-heap to maintain
// the max k elements at
// any point of time;
PriorityQueue pq = new PriorityQueue();
// Sort the array
// in ascending order
Arrays.sort(arr);
// add max k elements
// to the heap
double sum = 0;
for (int i = n - 1; i >= n - k; i--) {
pq.add(arr[i]);
sum = sum + arr[i];
}
// perform offline queries
for (int i = 0; i < m; i++) {
// if the minimum element in
// the heap is less than
// the incoming element
if (query[i] > pq.peek()) {
int polled = pq.poll();
pq.add(query[i]);
// decrement the current
// sum by the polled element
sum = sum - polled;
// increment sum by the
// incoming element
sum = sum + query[i];
}
// compute the average
max_avg = sum / (double)k;
System.out.println(max_avg);
}
}
// Driver code
public static void main(String[] args)
{
int n = 4;
int k = 3;
int m = 4;
int[] arr = new int[] { 1, 2, 3, 4 };
int[] query = new int[] { 7, 2, 1, 5 };
max_average_k_numbers(n, k, m, arr, query);
}
}
4.666666666666667
4.666666666666667
4.666666666666667
5.333333333333333
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。