@@ -65,23 +65,30 @@ movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
6565
6666### 方法一:循环数组
6767
68+ 我们定义一个变量 $\textit{s}$,用于计算当前最后 $\textit{size}$ 个元素的和,用一个变量 $\textit{cnt}$ 记录当前元素的总数。另外,我们用一个长度为 $\textit{size}$ 的数组 $\textit{data}$ 记录每个位置的元素对应的值。
69+
70+ 调用 $\textit{next}$ 函数时,我们先计算出 $\textit{val}$ 要存放的下标 $i$,然后我们更新元素和 $s$,并且将下标 $i$ 处的值设置为 $\textit{val}$,同时将元素的个数加一。最后,我们返回 $\frac{s}{\min(\textit{cnt}, \textit{size})}$ 的值即可。
71+
72+ 时间复杂度 $O(1)$,空间复杂度 $O(n)$,其中 $n$ 是题目给定的整数 $\textit{size}$。
73+
6874<!-- tabs:start -->
6975
7076#### Python3
7177
7278``` python
7379class MovingAverage :
80+
7481 def __init__ (self , size : int ):
75- self .arr = [0 ] * size
7682 self .s = 0
83+ self .data = [0 ] * size
7784 self .cnt = 0
7885
7986 def next (self , val : int ) -> float :
80- idx = self .cnt % len (self .arr )
81- self .s += val - self .arr[idx ]
82- self .arr[idx ] = val
87+ i = self .cnt % len (self .data )
88+ self .s += val - self .data[i ]
89+ self .data[i ] = val
8390 self .cnt += 1
84- return self .s / min (self .cnt, len (self .arr ))
91+ return self .s / min (self .cnt, len (self .data ))
8592
8693
8794# Your MovingAverage object will be instantiated and called as such:
@@ -93,20 +100,20 @@ class MovingAverage:
93100
94101``` java
95102class MovingAverage {
96- private int [] arr;
97103 private int s;
98104 private int cnt;
105+ private int [] data;
99106
100107 public MovingAverage (int size ) {
101- arr = new int [size];
108+ data = new int [size];
102109 }
103110
104111 public double next (int val ) {
105- int idx = cnt % arr . length;
106- s += val - arr[idx ];
107- arr[idx ] = val;
112+ int i = cnt % data . length;
113+ s += val - data[i ];
114+ data[i ] = val;
108115 ++ cnt;
109- return s * 1.0 / Math . min(cnt, arr . length);
116+ return s * 1.0 / Math . min(cnt, data . length);
110117 }
111118}
112119
@@ -123,21 +130,21 @@ class MovingAverage {
123130class MovingAverage {
124131public:
125132 MovingAverage(int size) {
126- arr .resize(size);
133+ data .resize(size);
127134 }
128135
129136 double next(int val) {
130- int idx = cnt % arr .size();
131- s += val - arr[idx ];
132- arr[idx ] = val;
137+ int i = cnt % data .size();
138+ s += val - data[i ];
139+ data[i ] = val;
133140 ++cnt;
134- return (double) s / min(cnt, (int) arr .size());
141+ return s * 1.0 / min(cnt, (int) data .size());
135142 }
136143
137144private:
138- vector<int > arr;
139- int cnt = 0 ;
140145 int s = 0 ;
146+ int cnt = 0 ;
147+ vector<int > data;
141148};
142149
143150/* *
@@ -151,22 +158,23 @@ private:
151158
152159``` go
153160type MovingAverage struct {
154- arr [] int
155- cnt int
156- s int
161+ s int
162+ cnt int
163+ data [] int
157164}
158165
159166func Constructor (size int ) MovingAverage {
160- arr := make ([]int , size)
161- return MovingAverage{arr, 0 , 0 }
167+ return MovingAverage{
168+ data: make ([]int , size),
169+ }
162170}
163171
164172func (this *MovingAverage ) Next (val int ) float64 {
165- idx := this.cnt % len (this.arr )
166- this.s += val - this.arr [idx ]
167- this.arr [idx ] = val
173+ i := this.cnt % len (this.data )
174+ this.s += val - this.data [i ]
175+ this.data [i ] = val
168176 this.cnt ++
169- return float64 (this.s ) / float64 (min (this.cnt , len (this.arr )))
177+ return float64 (this.s ) / float64 (min (this.cnt , len (this.data )))
170178}
171179
172180/* *
@@ -176,6 +184,34 @@ func (this *MovingAverage) Next(val int) float64 {
176184 */
177185```
178186
187+ #### TypeScript
188+
189+ ``` ts
190+ class MovingAverage {
191+ private s: number = 0 ;
192+ private cnt: number = 0 ;
193+ private data: number [];
194+
195+ constructor (size : number ) {
196+ this .data = Array (size ).fill (0 );
197+ }
198+
199+ next(val : number ): number {
200+ const i = this .cnt % this .data .length ;
201+ this .s += val - this .data [i ];
202+ this .data [i ] = val ;
203+ this .cnt ++ ;
204+ return this .s / Math .min (this .cnt , this .data .length );
205+ }
206+ }
207+
208+ /**
209+ * Your MovingAverage object will be instantiated and called as such:
210+ * var obj = new MovingAverage(size)
211+ * var param_1 = obj.next(val)
212+ */
213+ ```
214+
179215<!-- tabs:end -->
180216
181217<!-- solution:end -->
@@ -184,6 +220,12 @@ func (this *MovingAverage) Next(val int) float64 {
184220
185221### 方法二:队列
186222
223+ 我们可以使用一个队列 $\textit{q}$ 来存储最后 $\textit{size}$ 个元素,同时用一个变量 $\textit{s}$ 来记录这 $\textit{size}$ 个元素的和。
224+
225+ 在调用 $\textit{next}$ 函数时,我们首先判断队列 $\textit{q}$ 的长度是否等于 $\textit{size}$,如果等于 $\textit{size}$,则将队列 $\textit{q}$ 的头部元素出队,并且更新 $\textit{s}$ 的值。然后将 $\textit{val}$ 入队,并且更新 $\textit{s}$ 的值。最后返回 $\frac{s}{\text{len}(q)}$ 的值即可。
226+
227+ 时间复杂度 $O(1)$,空间复杂度 $O(n)$,其中 $n$ 是题目给定的整数 $\textit{size}$。
228+
187229<!-- tabs:start -->
188230
189231#### Python3
@@ -299,6 +341,35 @@ func (this *MovingAverage) Next(val int) float64 {
299341 */
300342```
301343
344+ #### TypeScript
345+
346+ ``` ts
347+ class MovingAverage {
348+ private q: number [] = [];
349+ private s: number = 0 ;
350+ private n: number ;
351+
352+ constructor (size : number ) {
353+ this .n = size ;
354+ }
355+
356+ next(val : number ): number {
357+ if (this .q .length === this .n ) {
358+ this .s -= this .q .shift ()! ;
359+ }
360+ this .q .push (val );
361+ this .s += val ;
362+ return this .s / this .q .length ;
363+ }
364+ }
365+
366+ /**
367+ * Your MovingAverage object will be instantiated and called as such:
368+ * var obj = new MovingAverage(size)
369+ * var param_1 = obj.next(val)
370+ */
371+ ```
372+
302373<!-- tabs:end -->
303374
304375<!-- solution:end -->
0 commit comments