54
54
55
55
** 方法一:模拟**
56
56
57
- 直接模拟倒香槟的过程,定义二维数组 $g$,初始时 ` g[0][j]=poured ` 。
57
+ 我们直接模拟倒香槟的过程 。
58
58
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 $。
60
60
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$。
62
68
63
69
<!-- tabs:start -->
64
70
69
75
``` python
70
76
class Solution :
71
77
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
74
80
for i in range (query_row + 1 ):
75
81
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])
82
103
```
83
104
84
105
### ** Java**
@@ -88,19 +109,39 @@ class Solution:
88
109
``` java
89
110
class Solution {
90
111
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;
93
114
for (int i = 0 ; i <= query_row; ++ i) {
94
115
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;
100
121
}
101
122
}
102
123
}
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]);
104
145
}
105
146
}
106
147
```
@@ -111,19 +152,41 @@ class Solution {
111
152
class Solution {
112
153
public:
113
154
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;
116
157
for (int i = 0; i <= query_row; ++i) {
117
158
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;
123
185
}
124
186
}
187
+ memcpy(f, g, sizeof g);
125
188
}
126
- return g [ query_row ] [ query_glass ] ;
189
+ return min(1.0, f[ query_glass]) ;
127
190
}
128
191
};
129
192
```
@@ -132,22 +195,37 @@ public:
132
195
133
196
``` go
134
197
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)
140
200
for i := 0 ; i <= query_row; i++ {
141
201
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
147
224
}
148
225
}
226
+ f = g
149
227
}
150
- return g[query_row][ query_glass]
228
+ return math. Min ( 1 , f[ query_glass])
151
229
}
152
230
```
153
231
0 commit comments