@@ -65,23 +65,30 @@ movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
65
65
66
66
### 方法一:循环数组
67
67
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
+
68
74
<!-- tabs:start -->
69
75
70
76
#### Python3
71
77
72
78
``` python
73
79
class MovingAverage :
80
+
74
81
def __init__ (self , size : int ):
75
- self .arr = [0 ] * size
76
82
self .s = 0
83
+ self .data = [0 ] * size
77
84
self .cnt = 0
78
85
79
86
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
83
90
self .cnt += 1
84
- return self .s / min (self .cnt, len (self .arr ))
91
+ return self .s / min (self .cnt, len (self .data ))
85
92
86
93
87
94
# Your MovingAverage object will be instantiated and called as such:
@@ -93,20 +100,20 @@ class MovingAverage:
93
100
94
101
``` java
95
102
class MovingAverage {
96
- private int [] arr;
97
103
private int s;
98
104
private int cnt;
105
+ private int [] data;
99
106
100
107
public MovingAverage (int size ) {
101
- arr = new int [size];
108
+ data = new int [size];
102
109
}
103
110
104
111
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;
108
115
++ cnt;
109
- return s * 1.0 / Math . min(cnt, arr . length);
116
+ return s * 1.0 / Math . min(cnt, data . length);
110
117
}
111
118
}
112
119
@@ -123,21 +130,21 @@ class MovingAverage {
123
130
class MovingAverage {
124
131
public:
125
132
MovingAverage(int size) {
126
- arr .resize(size);
133
+ data .resize(size);
127
134
}
128
135
129
136
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;
133
140
++cnt;
134
- return (double) s / min(cnt, (int) arr .size());
141
+ return s * 1.0 / min(cnt, (int) data .size());
135
142
}
136
143
137
144
private:
138
- vector<int > arr;
139
- int cnt = 0 ;
140
145
int s = 0 ;
146
+ int cnt = 0 ;
147
+ vector<int > data;
141
148
};
142
149
143
150
/* *
@@ -151,22 +158,23 @@ private:
151
158
152
159
``` go
153
160
type MovingAverage struct {
154
- arr [] int
155
- cnt int
156
- s int
161
+ s int
162
+ cnt int
163
+ data [] int
157
164
}
158
165
159
166
func Constructor (size int ) MovingAverage {
160
- arr := make ([]int , size)
161
- return MovingAverage{arr, 0 , 0 }
167
+ return MovingAverage{
168
+ data: make ([]int , size),
169
+ }
162
170
}
163
171
164
172
func (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
168
176
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 )))
170
178
}
171
179
172
180
/* *
@@ -176,6 +184,34 @@ func (this *MovingAverage) Next(val int) float64 {
176
184
*/
177
185
```
178
186
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
+
179
215
<!-- tabs:end -->
180
216
181
217
<!-- solution:end -->
@@ -184,6 +220,12 @@ func (this *MovingAverage) Next(val int) float64 {
184
220
185
221
### 方法二:队列
186
222
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
+
187
229
<!-- tabs:start -->
188
230
189
231
#### Python3
@@ -299,6 +341,35 @@ func (this *MovingAverage) Next(val int) float64 {
299
341
*/
300
342
```
301
343
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
+
302
373
<!-- tabs:end -->
303
374
304
375
<!-- solution:end -->
0 commit comments