[抄題]:
給出一串整數流和窗口大小,計算滑動窗口中所有整數的平均值。
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實現就行。
[輸入量]:空: 正常情況:特大:特小:程序里處理到的特殊情況:異常情況(不合法不合理的輸入):
[畫圖]:
[一刷]:
- 判斷queue尺寸,已經滿了,就先拿出來 再放進去。
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分鍾肉眼debug的結果]:
[總結]:
- 方法中只有實現,沒有聲明。que = new LinkedList<Integer>();即可
[復雜度]:Time complexity: O(n) Space complexity: O(n)
n個點,每個點執行一次。不知道queue都是這樣嗎?下次注意
[英文數據結構或算法,為什么不用別的數據結構或算法]:
[其他解法]:
前綴和,沒有通用性,算了
- 時間分析:方便快速求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();// } }