Skip to content

Commit b8b6da2

Browse files
committed
feat: update solutions to lc/lcof2 problems
* lc No.0346 & lcof2 No.041. Moving Average from Data Stream
1 parent b67487a commit b8b6da2

File tree

7 files changed

+400
-113
lines changed

7 files changed

+400
-113
lines changed

lcof2/剑指 Offer II 041. 滑动窗口的平均值/README.md

+147-57
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
5050

5151
<!-- 这里可写通用的实现逻辑 -->
5252

53-
“循环数组/队列”实现。
53+
**方法一:循环数组**
54+
55+
**方法二:队列**
5456

5557
<!-- tabs:start -->
5658

@@ -62,21 +64,38 @@ movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
6264
class MovingAverage:
6365

6466
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
7270

7371
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+
8099

81100
# Your MovingAverage object will be instantiated and called as such:
82101
# obj = MovingAverage(size)
@@ -89,24 +108,47 @@ class MovingAverage:
89108

90109
```java
91110
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;
96114

97-
/** Initialize your data structure here. */
98115
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);
101125
}
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+
```
102134

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+
103145
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();
110152
}
111153
}
112154

@@ -122,26 +164,53 @@ class MovingAverage {
122164
```cpp
123165
class MovingAverage {
124166
public:
125-
/** Initialize your data structure here. */
126167
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());
129177
}
130178

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+
131199
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();
138208
}
139209
140210
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;
145214
};
146215
147216
/**
@@ -155,29 +224,22 @@ private:
155224

156225
```go
157226
type MovingAverage struct {
158-
size int
159-
data []int
160-
sum int
161-
count int
227+
arr []int
228+
cnt int
229+
s int
162230
}
163231

164-
/** Initialize your data structure here. */
165232
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}
172235
}
173236

174237
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)))
181243
}
182244

183245
func min(a, b int) int {
@@ -194,6 +256,34 @@ func min(a, b int) int {
194256
*/
195257
```
196258

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+
197287
### **...**
198288

199289
```

lcof2/剑指 Offer II 041. 滑动窗口的平均值/Solution.cpp

+9-13
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,21 @@
11
class MovingAverage {
22
public:
3-
/** Initialize your data structure here. */
43
MovingAverage(int size) {
5-
this->size = size;
6-
data.resize(size);
4+
arr.resize(size);
75
}
86

97
double next(int val) {
10-
int idx = count % size;
11-
int oldVal = data[idx];
12-
data[idx] = val;
13-
sum += val - oldVal;
14-
++count;
15-
return (double) sum / min(count, size);
8+
int idx = cnt % arr.size();
9+
s += val - arr[idx];
10+
arr[idx] = val;
11+
++cnt;
12+
return (double) s / min(cnt, (int) arr.size());
1613
}
1714

1815
private:
19-
int size = 0;
20-
vector<int> data;
21-
int sum = 0;
22-
int count = 0;
16+
vector<int> arr;
17+
int cnt = 0;
18+
int s = 0;
2319
};
2420

2521
/**

lcof2/剑指 Offer II 041. 滑动窗口的平均值/Solution.go

+10-17
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,20 @@
11
type MovingAverage struct {
2-
size int
3-
data []int
4-
sum int
5-
count int
2+
arr []int
3+
cnt int
4+
s int
65
}
76

8-
/** Initialize your data structure here. */
97
func Constructor(size int) MovingAverage {
10-
return MovingAverage{
11-
size: size,
12-
data: make([]int, size),
13-
sum: 0,
14-
count: 0,
15-
}
8+
arr := make([]int, size)
9+
return MovingAverage{arr, 0, 0}
1610
}
1711

1812
func (this *MovingAverage) Next(val int) float64 {
19-
idx := this.count % this.size
20-
oldVal := this.data[idx]
21-
this.data[idx] = val
22-
this.sum += val - oldVal
23-
this.count++
24-
return float64(this.sum) / float64(min(this.count, this.size))
13+
idx := this.cnt % len(this.arr)
14+
this.s += val - this.arr[idx]
15+
this.arr[idx] = val
16+
this.cnt++
17+
return float64(this.s) / float64(min(this.cnt, len(this.arr)))
2518
}
2619

2720
func min(a, b int) int {

lcof2/剑指 Offer II 041. 滑动窗口的平均值/Solution.java

+9-13
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
class MovingAverage {
2-
private int size;
3-
private int[] data;
4-
private int sum;
5-
private int count;
2+
private int[] arr;
3+
private int s;
4+
private int cnt;
65

7-
/** Initialize your data structure here. */
86
public MovingAverage(int size) {
9-
this.size = size;
10-
this.data = new int[size];
7+
arr = new int[size];
118
}
129

1310
public double next(int val) {
14-
int idx = count % size;
15-
int oldVal = data[idx];
16-
data[idx] = val;
17-
sum += val - oldVal;
18-
++count;
19-
return sum * 1.0 / Math.min(count, size);
11+
int idx = cnt % arr.length;
12+
s += val - arr[idx];
13+
arr[idx] = val;
14+
++cnt;
15+
return s * 1.0 / Math.min(cnt, arr.length);
2016
}
2117
}
2218

0 commit comments

Comments
 (0)