數據流滑動窗口平均值 · sliding window average from data stream


[抄題]:

給出一串整數流和窗口大小,計算滑動窗口中所有整數的平均值。

MovingAverage m = new MovingAverage(3);
m.next(1) = 1 // 返回 1.00000
m.next(10) = (1 + 10) / 2 // 返回 5.50000
m.next(3) = (1 + 10 + 3) / 3 // 返回 4.66667
m.next(5) = (10 + 3 + 5) / 3 // 返回 6.00000

 [暴力解法]:

來一個數就存數組,for 循環最近size個數求和取平均返回。

時間分析:size

空間分析:n

[思維問題]:

不知道為什么要定義全局變量:因為兩個函數中都要用。

提前聲明,在函數中分別具體實現。

[一句話思路]:

先進先出,用queue實現就行。

[輸入量]:空: 正常情況:特大:特小:程序里處理到的特殊情況:異常情況(不合法不合理的輸入):

[畫圖]:

[一刷]:

  1. 判斷queue尺寸,已經滿了,就先拿出來 再放進去。

[二刷]:

[三刷]:

[四刷]:

[五刷]:

  [五分鍾肉眼debug的結果]:

[總結]:

  1. 方法中只有實現,沒有聲明。que = new LinkedList<Integer>();即可

[復雜度]:Time complexity: O(n) Space complexity: O(n)

n個點,每個點執行一次。不知道queue都是這樣嗎?下次注意

[英文數據結構或算法,為什么不用別的數據結構或算法]:

[其他解法]:

前綴和,沒有通用性,算了

  1. 時間分析:方便快速求a數組中某一段的和 前綴和做差法 a[k] + a[k + 1] +... + a[j] = s[j] - s[k -1] 時間復雜度降成o(1) 

[Follow Up]:

[LC給出的題目變變變]:

239. Sliding Window Maximum median 一堆數求最值,用堆

773. Sliding Puzzle 最短路,用bfs

 [代碼風格] :

/  除號兩邊要打空格

public class MovingAverage {
    /*
    * @param size: An integer
    */
        private double sum = 0;//
        private int size;
        private int val;
        private Queue<Integer> que;
        
        public MovingAverage(int size) {
        this.size = size;
        que = new LinkedList<Integer>();
    }

    /*
     * @param val: An integer
     * @return:  
     */
    public double next(int val) {
        this.val = val;
        this.sum = sum;
        sum += val;
        if (que.size() == size) {
            sum = sum - que.poll();
        }
        que.offer(val);
        
        return sum / que.size();//
    }
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM