@@ -50,7 +50,9 @@ movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
50
50
51
51
<!-- 这里可写通用的实现逻辑 -->
52
52
53
- “循环数组/队列”实现。
53
+ ** 方法一:循环数组**
54
+
55
+ ** 方法二:队列**
54
56
55
57
<!-- tabs:start -->
56
58
@@ -62,21 +64,38 @@ movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
62
64
class MovingAverage :
63
65
64
66
def __init__ (self , size : int ):
65
- """
66
- Initialize your data structure here.
67
- """
68
- self .size = size
69
- self .data = [0 ] * size
70
- self .sum = 0
71
- self .count = 0
67
+ self .arr = [0 ] * size
68
+ self .s = 0
69
+ self .cnt = 0
72
70
73
71
def next (self , val : int ) -> float :
74
- idx = self .count % self .size
75
- old_val = self .data[idx]
76
- self .data[idx] = val
77
- self .sum += val - old_val
78
- self .count += 1
79
- return self .sum / min (self .count, self .size)
72
+ idx = self .cnt % len (self .arr)
73
+ self .s += val - self .arr[idx]
74
+ self .arr[idx] = val
75
+ self .cnt += 1
76
+ return self .s / min (self .cnt, len (self .arr))
77
+
78
+
79
+ # Your MovingAverage object will be instantiated and called as such:
80
+ # obj = MovingAverage(size)
81
+ # param_1 = obj.next(val)
82
+ ```
83
+
84
+ ``` python
85
+ class MovingAverage :
86
+
87
+ def __init__ (self , size : int ):
88
+ self .n = size
89
+ self .s = 0
90
+ self .q = deque()
91
+
92
+ def next (self , val : int ) -> float :
93
+ if len (self .q) == self .n:
94
+ self .s -= self .q.popleft()
95
+ self .q.append(val)
96
+ self .s += val
97
+ return self .s / len (self .q)
98
+
80
99
81
100
# Your MovingAverage object will be instantiated and called as such:
82
101
# obj = MovingAverage(size)
@@ -89,24 +108,47 @@ class MovingAverage:
89
108
90
109
``` java
91
110
class MovingAverage {
92
- private int size;
93
- private int [] data;
94
- private int sum;
95
- private int count;
111
+ private int [] arr;
112
+ private int s;
113
+ private int cnt;
96
114
97
- /* * Initialize your data structure here. */
98
115
public MovingAverage (int size ) {
99
- this . size = size;
100
- this . data = new int [size];
116
+ arr = new int [size];
117
+ }
118
+
119
+ public double next (int val ) {
120
+ int idx = cnt % arr. length;
121
+ s += val - arr[idx];
122
+ arr[idx] = val;
123
+ ++ cnt;
124
+ return s * 1.0 / Math . min(cnt, arr. length);
101
125
}
126
+ }
127
+
128
+ /**
129
+ * Your MovingAverage object will be instantiated and called as such:
130
+ * MovingAverage obj = new MovingAverage(size);
131
+ * double param_1 = obj.next(val);
132
+ */
133
+ ```
102
134
135
+ ``` java
136
+ class MovingAverage {
137
+ private Deque<Integer > q = new ArrayDeque<> ();
138
+ private int n;
139
+ private int s;
140
+
141
+ public MovingAverage (int size ) {
142
+ n = size;
143
+ }
144
+
103
145
public double next (int val ) {
104
- int idx = count % size;
105
- int oldVal = data[idx] ;
106
- data[idx] = val;
107
- sum += val - oldVal ;
108
- ++ count ;
109
- return sum * 1.0 / Math . min(count, size);
146
+ if (q . size() == n) {
147
+ s -= q . pollFirst() ;
148
+ }
149
+ q . offer( val) ;
150
+ s += val ;
151
+ return s * 1.0 / q . size( );
110
152
}
111
153
}
112
154
@@ -122,26 +164,53 @@ class MovingAverage {
122
164
``` cpp
123
165
class MovingAverage {
124
166
public:
125
- /** Initialize your data structure here. * /
126
167
MovingAverage(int size) {
127
- this->size = size;
128
- data.resize(size);
168
+ arr.resize(size);
169
+ }
170
+
171
+ double next(int val) {
172
+ int idx = cnt % arr.size();
173
+ s += val - arr[ idx] ;
174
+ arr[ idx] = val;
175
+ ++cnt;
176
+ return (double) s / min(cnt, (int) arr.size());
129
177
}
130
178
179
+ private:
180
+ vector<int > arr;
181
+ int cnt = 0;
182
+ int s = 0;
183
+ };
184
+
185
+ /**
186
+ * Your MovingAverage object will be instantiated and called as such:
187
+ * MovingAverage* obj = new MovingAverage(size);
188
+ * double param_1 = obj->next(val);
189
+ * /
190
+ ```
191
+
192
+ ```cpp
193
+ class MovingAverage {
194
+ public:
195
+ MovingAverage(int size) {
196
+ n = size;
197
+ }
198
+
131
199
double next(int val) {
132
- int idx = count % size;
133
- int oldVal = data[idx];
134
- data[idx] = val;
135
- sum += val - oldVal;
136
- ++count;
137
- return (double) sum / min(count, size);
200
+ if (q.size() == n)
201
+ {
202
+ s -= q.front();
203
+ q.pop();
204
+ }
205
+ q.push(val);
206
+ s += val;
207
+ return (double) s / q.size();
138
208
}
139
209
140
210
private:
141
- int size = 0 ;
142
- vector<int > data;
143
- int sum = 0 ;
144
- int count = 0 ;
211
+ queue<int> q;
212
+ int s = 0;
213
+ int n;
145
214
};
146
215
147
216
/**
@@ -155,29 +224,22 @@ private:
155
224
156
225
``` go
157
226
type MovingAverage struct {
158
- size int
159
- data []int
160
- sum int
161
- count int
227
+ arr []int
228
+ cnt int
229
+ s int
162
230
}
163
231
164
- /* * Initialize your data structure here. */
165
232
func Constructor (size int ) MovingAverage {
166
- return MovingAverage{
167
- size: size,
168
- data: make ([]int , size),
169
- sum: 0 ,
170
- count: 0 ,
171
- }
233
+ arr := make ([]int , size)
234
+ return MovingAverage{arr, 0 , 0 }
172
235
}
173
236
174
237
func (this *MovingAverage ) Next (val int ) float64 {
175
- idx := this.count % this.size
176
- oldVal := this.data [idx]
177
- this.data [idx] = val
178
- this.sum += val - oldVal
179
- this.count ++
180
- return float64 (this.sum ) / float64 (min (this.count , this.size ))
238
+ idx := this.cnt % len (this.arr )
239
+ this.s += val - this.arr [idx]
240
+ this.arr [idx] = val
241
+ this.cnt ++
242
+ return float64 (this.s ) / float64 (min (this.cnt , len (this.arr )))
181
243
}
182
244
183
245
func min (a , b int ) int {
@@ -194,6 +256,34 @@ func min(a, b int) int {
194
256
*/
195
257
```
196
258
259
+ ``` go
260
+ type MovingAverage struct {
261
+ q []int
262
+ s int
263
+ n int
264
+ }
265
+
266
+ func Constructor (size int ) MovingAverage {
267
+ return MovingAverage{n: size}
268
+ }
269
+
270
+ func (this *MovingAverage ) Next (val int ) float64 {
271
+ if len (this.q ) == this.n {
272
+ this.s -= this.q [0 ]
273
+ this.q = this.q [1 :]
274
+ }
275
+ this.q = append (this.q , val)
276
+ this.s += val
277
+ return float64 (this.s ) / float64 (len (this.q ))
278
+ }
279
+
280
+ /* *
281
+ * Your MovingAverage object will be instantiated and called as such:
282
+ * obj := Constructor(size);
283
+ * param_1 := obj.Next(val);
284
+ */
285
+ ```
286
+
197
287
### ** ...**
198
288
199
289
```
0 commit comments