346. Moving Average from Data Stream - cocoder39/coco39_LC GitHub Wiki
346. Moving Average from Data Stream
solution 1: deque simple
solution 2: circular array
class MovingAverage:
def __init__(self, size: int):
self.size = size
self.queue = [0] * size
self.cur_idx = -1
self.window_sum = 0
self.count = 0
def next(self, val: int) -> float:
self.count += 1
self.cur_idx = (self.cur_idx + 1) % self.size
old_val = self.queue[self.cur_idx]
self.window_sum = self.window_sum - old_val + val
self.queue[self.cur_idx] = val
return self.window_sum / min(self.count, self.size)
=======================================
deque or circular array
class MovingAverage {
public:
/** Initialize your data structure here. */
MovingAverage(int size) {
cap = size;
sum = 0;
}
double next(int val) {
dq.push_back(val);
sum += val;
if (dq.size() > cap) {
int t = dq.front();
dq.pop_front();
sum -= t;
}
return sum / (double)dq.size();
}
private:
deque<int> dq;
int cap;
double sum;
};
class MovingAverage {
public:
/** Initialize your data structure here. */
MovingAverage(int size) {
buf = vector<double>(size);
sz = size;
}
double next(int val) {
sum += val - buf[idx];
buf[idx++] = val;
full = idx == sz ? true : full;
idx %= sz;
return sum / (full ? sz : idx);
}
private:
vector<double> buf;
int sz;
int idx = 0;
double sum = 0;
bool full = false;
};