Skip to content

Commit fed9d89

Browse files
committed
feat: update solutions to lc problem: No.0799
No.0799.Champagne Tower
1 parent 807bf16 commit fed9d89

File tree

6 files changed

+255
-111
lines changed

6 files changed

+255
-111
lines changed

solution/0700-0799/0799.Champagne Tower/README.md

+116-38
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,17 @@
5454

5555
**方法一:模拟**
5656

57-
直接模拟倒香槟的过程,定义二维数组 $g$,初始时 `g[0][j]=poured`
57+
我们直接模拟倒香槟的过程
5858

59-
对于每一层,如果当前杯子的香槟量 $g[i][j]$ 大于 $1$,香槟会向下一层的两个杯子倒入,倒入的量为 $\frac{g[i][j]-1}{2}$,即当前杯子的香槟量减去 $1$ 后除以 $2$,然后当前杯子的香槟量更新为 $1$。
59+
定义一个二维数组 $f$,其中 $f[i][j]$ 表示第 $i$ 层第 $j$ 个玻璃杯中的香槟量。初始时 $f[0][0] = poured$。
6060

61-
最后返回 `g[query_row][query_glass]` 即可。
61+
对于每一层,如果当前杯子的香槟量 $f[i][j]$ 大于 $1$,香槟会流向下一层的两个杯子,流入的量为 $\frac{f[i][j]-1}{2}$,即当前杯子的香槟量减去 $1$ 后除以 $2$,然后当前杯子的香槟量更新为 $1$。
62+
63+
模拟结束,返回 $f[query\_row][query\_glass]$ 即可。
64+
65+
由于每一层的香槟量只与上一层的香槟量有关,因此我们可以用滚动数组的方式优化空间复杂度,将二维数组优化为一维数组。
66+
67+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为层数,即 $query\_row$。
6268

6369
<!-- tabs:start -->
6470

@@ -69,16 +75,31 @@
6975
```python
7076
class Solution:
7177
def champagneTower(self, poured: int, query_row: int, query_glass: int) -> float:
72-
g = [[0] * 110 for _ in range(110)]
73-
g[0][0] = poured
78+
f = [[0] * 101 for _ in range(101)]
79+
f[0][0] = poured
7480
for i in range(query_row + 1):
7581
for j in range(i + 1):
76-
if g[i][j] > 1:
77-
half = (g[i][j] - 1) / 2
78-
g[i][j] = 1
79-
g[i + 1][j] += half
80-
g[i + 1][j + 1] += half
81-
return g[query_row][query_glass]
82+
if f[i][j] > 1:
83+
half = (f[i][j] - 1) / 2
84+
f[i][j] = 1
85+
f[i + 1][j] += half
86+
f[i + 1][j + 1] += half
87+
return f[query_row][query_glass]
88+
```
89+
90+
```python
91+
class Solution:
92+
def champagneTower(self, poured: int, query_row: int, query_glass: int) -> float:
93+
f = [poured]
94+
for i in range(1, query_row + 1):
95+
g = [0] * (i + 1)
96+
for j, v in enumerate(f):
97+
if v > 1:
98+
half = (v - 1) / 2
99+
g[j] += half
100+
g[j + 1] += half
101+
f = g
102+
return min(1, f[query_glass])
82103
```
83104

84105
### **Java**
@@ -88,19 +109,39 @@ class Solution:
88109
```java
89110
class Solution {
90111
public double champagneTower(int poured, int query_row, int query_glass) {
91-
double[][] g = new double[110][110];
92-
g[0][0] = poured;
112+
double[][] f = new double[101][101];
113+
f[0][0] = poured;
93114
for (int i = 0; i <= query_row; ++i) {
94115
for (int j = 0; j <= i; ++j) {
95-
if (g[i][j] > 1) {
96-
double half = (g[i][j] - 1) / 2.0;
97-
g[i][j] = 1;
98-
g[i + 1][j] += half;
99-
g[i + 1][j + 1] += half;
116+
if (f[i][j] > 1) {
117+
double half = (f[i][j] - 1) / 2.0;
118+
f[i][j] = 1;
119+
f[i + 1][j] += half;
120+
f[i + 1][j + 1] += half;
100121
}
101122
}
102123
}
103-
return g[query_row][query_glass];
124+
return f[query_row][query_glass];
125+
}
126+
}
127+
```
128+
129+
```java
130+
class Solution {
131+
public double champagneTower(int poured, int query_row, int query_glass) {
132+
double[] f = {poured};
133+
for (int i = 1; i <= query_row; ++i) {
134+
double[] g = new double[i + 1];
135+
for (int j = 0; j < i; ++j) {
136+
if (f[j] > 1) {
137+
double half = (f[j] - 1) / 2.0;
138+
g[j] += half;
139+
g[j + 1] += half;
140+
}
141+
}
142+
f = g;
143+
}
144+
return Math.min(1, f[query_glass]);
104145
}
105146
}
106147
```
@@ -111,19 +152,41 @@ class Solution {
111152
class Solution {
112153
public:
113154
double champagneTower(int poured, int query_row, int query_glass) {
114-
double g[110][110] = {0.0};
115-
g[0][0] = poured;
155+
double f[101][101] = {0.0};
156+
f[0][0] = poured;
116157
for (int i = 0; i <= query_row; ++i) {
117158
for (int j = 0; j <= i; ++j) {
118-
if (g[i][j] > 1) {
119-
double half = (g[i][j] - 1) / 2.0;
120-
g[i][j] = 1;
121-
g[i + 1][j] += half;
122-
g[i + 1][j + 1] += half;
159+
if (f[i][j] > 1) {
160+
double half = (f[i][j] - 1) / 2.0;
161+
f[i][j] = 1;
162+
f[i + 1][j] += half;
163+
f[i + 1][j + 1] += half;
164+
}
165+
}
166+
}
167+
return f[query_row][query_glass];
168+
}
169+
};
170+
```
171+
172+
```cpp
173+
class Solution {
174+
public:
175+
double champagneTower(int poured, int query_row, int query_glass) {
176+
double f[101] = {(double) poured};
177+
double g[101];
178+
for (int i = 1; i <= query_row; ++i) {
179+
memset(g, 0, sizeof g);
180+
for (int j = 0; j < i; ++j) {
181+
if (f[j] > 1) {
182+
double half = (f[j] - 1) / 2.0;
183+
g[j] += half;
184+
g[j + 1] += half;
123185
}
124186
}
187+
memcpy(f, g, sizeof g);
125188
}
126-
return g[query_row][query_glass];
189+
return min(1.0, f[query_glass]);
127190
}
128191
};
129192
```
@@ -132,22 +195,37 @@ public:
132195

133196
```go
134197
func champagneTower(poured int, query_row int, query_glass int) float64 {
135-
g := make([][]float64, 110)
136-
for i := range g {
137-
g[i] = make([]float64, 110)
138-
}
139-
g[0][0] = float64(poured)
198+
f := [101][101]float64{}
199+
f[0][0] = float64(poured)
140200
for i := 0; i <= query_row; i++ {
141201
for j := 0; j <= i; j++ {
142-
if g[i][j] > 1 {
143-
half := (g[i][j] - 1) / 2.0
144-
g[i][j] = 1
145-
g[i+1][j] += half
146-
g[i+1][j+1] += half
202+
if f[i][j] > 1 {
203+
half := (f[i][j] - 1) / 2.0
204+
f[i][j] = 1
205+
f[i+1][j] += half
206+
f[i+1][j+1] += half
207+
}
208+
}
209+
}
210+
return f[query_row][query_glass]
211+
}
212+
```
213+
214+
```go
215+
func champagneTower(poured int, query_row int, query_glass int) float64 {
216+
f := []float64{float64(poured)}
217+
for i := 1; i <= query_row; i++ {
218+
g := make([]float64, i+1)
219+
for j, v := range f {
220+
if v > 1 {
221+
half := (v - 1) / 2.0
222+
g[j] += half
223+
g[j+1] += half
147224
}
148225
}
226+
f = g
149227
}
150-
return g[query_row][query_glass]
228+
return math.Min(1, f[query_glass])
151229
}
152230
```
153231

0 commit comments

Comments
 (0)