LeetCode试炼之路之(3):数据流中的移动平均值(346)

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

给一个整数流和一个窗口,计算在给定大小的窗口里的数字的平均值。

解:

本题思路:
LinkedList.remove() 方法用于取出链表中的第一个值,并将其移除。
功能类似于 Queue.poll() 取出队列中第一支,并将其从队列中删除

每次传入新值的时候判断是否列表数量是否等于最大数量,如果是,则需要将最前面的一个值从列表中去除,然后塞入新值,然后用所有值求和除以当前列表值得数量,求得当前窗口中数字的平均值。

//保存当前窗口数字的总和
private double previousSum = 0.0;
//窗口的最大值
private int maxSize;
//链表用于保存当前窗口的值
private Queue<Integer> currentWindow;

public MovingAverage(int val){
    currentWindow = new LinkedList<Integer>();
    maxSize = val;
}

private double next(int val){
    double sum = 0;
    if(maxSize==currentWindow.size()){
        previousSum -= currentWindow.remove();
    }
    currentWindow.add(val);
    previousSum +=val;
    return previousSum/currentWindow.size();
}

猜你喜欢

转载自www.cnblogs.com/yaphse-19/p/12026735.html