剑指 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 @   忧愁的chafry  阅读(51)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示