Skip to content
/ leetcode Public
  • Sponsor doocs/leetcode

  • Notifications You must be signed in to change notification settings
  • Fork 9k

Commit 1cd3ae2

Browse files
authoredMar 20, 2025
feat: add solutions to lc problem: No.0346 (#4269)
1 parent f76309e commit 1cd3ae2

File tree

8 files changed

+274
-83
lines changed

8 files changed

+274
-83
lines changed
 

‎solution/0300-0399/0346.Moving Average from Data Stream/README.md

+98-27
Original file line numberDiff line numberDiff line change
@@ -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
7379
class 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
95102
class 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 {
123130
class MovingAverage {
124131
public:
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

137144
private:
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
153160
type MovingAverage struct {
154-
arr []int
155-
cnt int
156-
s int
161+
s int
162+
cnt int
163+
data []int
157164
}
158165

159166
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+
}
162170
}
163171

164172
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
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

Comments
 (0)