给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算其所有整数的移动平均值。
示例:
MovingAverage m = new MovingAverage(3);
m.next(1) = 1
m.next(10) = (1 + 10) / 2
m.next(3) = (1 + 10 + 3) / 3
m.next(5) = (10 + 3 + 5) / 3
解法一:双端队列
class MovingAverage {
private:
LinkedList<Integer> dequeue = new LinkedList<>();
int size;
long sum;
public:
/** Initialize your data structure here. */
MovingAverage(int size) {
this.size = size;
}
double next(int val) {
if (dequeue.size() == size)
sum -= dequeue.removeFirst();
dequeue.addLast(val);
sum += val;
// System.out.printf("size=%d, val=%d, dequeue=%s, sum=%d\n", size, val, dequeue, sum);
return (double)sum / dequeue.size();
}
}
/**
* Your MovingAverage object will be instantiated and called as such:
* MovingAverage obj = new MovingAverage(size);
* double param_1 = obj.next(val);
*/