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;
};
⚠️ **GitHub.com Fallback** ⚠️