首页 > 代码库 > LeetCode 346. Moving Average from Data Stream (数据流动中的移动平均值)

LeetCode 346. Moving Average from Data Stream (数据流动中的移动平均值)

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

 


题目标签:Design

  这道题目让我们设计一个移动平均值的结构,我们有一个input size, 这个size是控制着我们的window。每次都新的数字进来,如果目前的size小于window,那么继续加入。如果新的数字进来,size已经满了,等于window size。那么我们需要把第一个数字去除,然后加入新的数字。可以利用ArrayList来模仿queue实现,add 加入到最后, remove(0) 把第一个数字去除。还要设一个sum, 每次加入,就加入sum, 当满了之后,每次去除,只要从sum里减去。这样就可以避免每一次加入一个数字的时候,都要遍历一次queue来得到所有数字之和。

 

Java Solution:

Runtime beats 71.48% 

完成日期:07/09/2017

关键词:Design

关键点:利用ArrayList来模仿Queue

 

 1 public class MovingAverage {
 2 
 3     ArrayList<Integer> queue;
 4     int queue_size; 
 5     double sum;
 6     /** Initialize your data structure here. */
 7     public MovingAverage(int size) 
 8     {
 9         queue = new ArrayList<>(size);
10         queue_size = size;
11         sum = 0;
12     }
13     
14     public double next(int val) 
15     {
16         if(queue.size() == queue_size) // meaning it is full
17         {
18             sum -= queue.get(0); // minus head
19             queue.remove(0); // remove the head
20         }
21         
22         queue.add(val); //append the new integer
23         sum += val; // add into sum
24         
25         return (sum / queue.size());    
26     }
27 }
28 
29 /**
30  * Your MovingAverage object will be instantiated and called as such:
31  * MovingAverage obj = new MovingAverage(size);
32  * double param_1 = obj.next(val);
33  */

参考资料:N/A

 

LeetCode 算法题目列表 - LeetCode Algorithms Questions List

LeetCode 346. Moving Average from Data Stream (数据流动中的移动平均值)