剑指 Offer II 041. 滑动窗口的平均值(346. 数据流中的移动平均值)

题目:

 

思路:

【1】首先这个里面需要记录最大容量,其次塞数据的存储可以考虑队列。那么如果数据超过最大容量就会从队列将前边的数据弹出,而每次平均数将是  队列里面数据的和 / 队列里面数据的个数。

【2】然后可以优化的点

代码展示:

优化代码(利用数组的环思维替代队列,可以减少开辟的空间,其次对数组的操作会比操作队列要快一点,但是不明显):

//时间37 ms击败79.4%
//内存45.3 MB击败92.66%
class MovingAverage {
    int capacity, cursor, sum, cnt;
    int[] array;
        
    /** Initialize your data structure here. */
    public MovingAverage(int size) {
        this.capacity = size;
        this.array = new int[size];
    }

    public double next(int val) {
        sum += (val - array[cursor % capacity]);
        array[cursor++ % capacity] = val;
        cnt++;
        return (double) sum / Math.min(cnt, capacity);
    }
}

 

队列的形式:

//时间40 ms击败26.95%
//内存45.7 MB击败44.1%
class MovingAverage {
    Queue<Integer> queue;
    int size;
    double sum;

    /** Initialize your data structure here. */
    public MovingAverage(int size) {
        queue = new ArrayDeque<Integer>();
        this.size = size;
        sum = 0;
    }
    
    public double next(int val) {
        if (queue.size() == size) {
            sum -= queue.poll();
        }
        queue.offer(val);
        sum += val;
        return sum / queue.size();
    }
}

/**
 * Your MovingAverage object will be instantiated and called as such:
 * MovingAverage obj = new MovingAverage(size);
 * double param_1 = obj.next(val);
 */

 

posted @ 2023-03-02 18:24  忧愁的chafry  阅读(68)  评论(0)    收藏  举报