File tree 3 files changed +73
-3
lines changed
solution/2100-2199/2137.Pour Water Between Buckets to Make Water Levels Equal
3 files changed +73
-3
lines changed Original file line number Diff line number Diff line change 60
60
61
61
我们注意到,如果一个水量 $x$ 满足条件,那么所有小于 $x$ 的水量也满足条件。因此我们可以使用二分查找的方法找到最大的满足条件的水量。
62
62
63
- 我们定义二分查找的左边界 $l=0$,右边界 $r=\max(buckets)$。每次二分查找时,我们取 $l$ 和 $r$ 的中点 $m $,判断 $m $ 是否满足条件。如果满足条件,那么我们将 $l$ 更新为 $m $,否则我们将 $r$ 更新为 $m$。在二分查找结束后,最大的满足条件的水量即为 $l$。
63
+ 我们定义二分查找的左边界 $l=0$,右边界 $r=\max(buckets)$。每次二分查找时,我们取 $l$ 和 $r$ 的中点 $mid $,判断 $mid $ 是否满足条件。如果满足条件,那么我们将 $l$ 更新为 $mid $,否则我们将 $r$ 更新为 $m$。在二分查找结束后,最大的满足条件的水量即为 $l$。
64
64
65
65
问题的关键转换为如果判断一个水量 $v$ 是否满足条件。我们可以遍历所有水桶,对于每个水桶,如果其水量大于 $v$,那么需要倒出 $x-v$ 的水量;如果其水量小于 $v$,那么需要向其中倒入 $(v-x)\times\frac{100}{100-\textit{loss}}$ 的水量。如果倒出的水量大于等于倒入的水量,那么说明 $v$ 满足条件。
66
66
@@ -195,7 +195,30 @@ func equalizeWater(buckets []int, loss int) float64 {
195
195
### ** TypeScript**
196
196
197
197
``` ts
198
-
198
+ function equalizeWater(buckets : number [], loss : number ): number {
199
+ let l = 0 ;
200
+ let r = Math .max (... buckets );
201
+ const check = (v : number ): boolean => {
202
+ let [a, b] = [0 , 0 ];
203
+ for (const x of buckets ) {
204
+ if (x >= v ) {
205
+ a += x - v ;
206
+ } else {
207
+ b += ((v - x ) * 100 ) / (100 - loss );
208
+ }
209
+ }
210
+ return a >= b ;
211
+ };
212
+ while (r - l > 1e-5 ) {
213
+ const mid = (l + r ) / 2 ;
214
+ if (check (mid )) {
215
+ l = mid ;
216
+ } else {
217
+ r = mid ;
218
+ }
219
+ }
220
+ return l ;
221
+ }
199
222
```
200
223
201
224
### ** ...**
Original file line number Diff line number Diff line change @@ -178,7 +178,30 @@ func equalizeWater(buckets []int, loss int) float64 {
178
178
### ** TypeScript**
179
179
180
180
``` ts
181
-
181
+ function equalizeWater(buckets : number [], loss : number ): number {
182
+ let l = 0 ;
183
+ let r = Math .max (... buckets );
184
+ const check = (v : number ): boolean => {
185
+ let [a, b] = [0 , 0 ];
186
+ for (const x of buckets ) {
187
+ if (x >= v ) {
188
+ a += x - v ;
189
+ } else {
190
+ b += ((v - x ) * 100 ) / (100 - loss );
191
+ }
192
+ }
193
+ return a >= b ;
194
+ };
195
+ while (r - l > 1e-5 ) {
196
+ const mid = (l + r ) / 2 ;
197
+ if (check (mid )) {
198
+ l = mid ;
199
+ } else {
200
+ r = mid ;
201
+ }
202
+ }
203
+ return l ;
204
+ }
182
205
```
183
206
184
207
### ** ...**
Original file line number Diff line number Diff line change
1
+ function equalizeWater ( buckets : number [ ] , loss : number ) : number {
2
+ let l = 0 ;
3
+ let r = Math . max ( ...buckets ) ;
4
+ const check = ( v : number ) : boolean => {
5
+ let [ a , b ] = [ 0 , 0 ] ;
6
+ for ( const x of buckets ) {
7
+ if ( x >= v ) {
8
+ a += x - v ;
9
+ } else {
10
+ b += ( ( v - x ) * 100 ) / ( 100 - loss ) ;
11
+ }
12
+ }
13
+ return a >= b ;
14
+ } ;
15
+ while ( r - l > 1e-5 ) {
16
+ const mid = ( l + r ) / 2 ;
17
+ if ( check ( mid ) ) {
18
+ l = mid ;
19
+ } else {
20
+ r = mid ;
21
+ }
22
+ }
23
+ return l ;
24
+ }
You can’t perform that action at this time.
0 commit comments