346. Moving Average from Data Stream
- Total Accepted: 11701
- Total Submissions: 20717
- Difficulty: Easy
- Contributors: Admin
Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window.
For example,
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
Code
class MovingAverage(object):
def __init__(self, size):
"""
Initialize your data structure here.
:type size: int
"""
self.size = size
self.vals = [0]* size
self.cnt = 0
self.sum = 0
def next(self, val):
"""
:type val: int
:rtype: float
"""
self.cnt += 1
idx = (self.cnt - 1) % self.size
# replace old value
self.sum -= self.vals[idx]
self.sum += val
self.vals[idx] = val
return float(self.sum) / self.cnt if self.cnt < self.size \
else float(self.sum) / self.size
# Your MovingAverage object will be instantiated and called as such:
# obj = MovingAverage(size)
# param_1 = obj.next(val)
Idea
A cyclic list
You can also use deque however when you calculate average it takes O(K) time where K is the window size.: https://discuss.leetcode.com/topic/44116/4-line-python-solution-using-deque