Skip to content

Commit 794530a

Browse files
authored
feat: add ts solution to lc problem: No.2137 (#1724)
No.2137.Pour Water Between Buckets to Make Water Levels Equal
1 parent a2fb870 commit 794530a

File tree

3 files changed

+73
-3
lines changed

3 files changed

+73
-3
lines changed

solution/2100-2199/2137.Pour Water Between Buckets to Make Water Levels Equal/README.md

+25-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060

6161
我们注意到,如果一个水量 $x$ 满足条件,那么所有小于 $x$ 的水量也满足条件。因此我们可以使用二分查找的方法找到最大的满足条件的水量。
6262

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$。
6464

6565
问题的关键转换为如果判断一个水量 $v$ 是否满足条件。我们可以遍历所有水桶,对于每个水桶,如果其水量大于 $v$,那么需要倒出 $x-v$ 的水量;如果其水量小于 $v$,那么需要向其中倒入 $(v-x)\times\frac{100}{100-\textit{loss}}$ 的水量。如果倒出的水量大于等于倒入的水量,那么说明 $v$ 满足条件。
6666

@@ -195,7 +195,30 @@ func equalizeWater(buckets []int, loss int) float64 {
195195
### **TypeScript**
196196

197197
```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+
}
199222
```
200223

201224
### **...**

solution/2100-2199/2137.Pour Water Between Buckets to Make Water Levels Equal/README_EN.md

+24-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,30 @@ func equalizeWater(buckets []int, loss int) float64 {
178178
### **TypeScript**
179179

180180
```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+
}
182205
```
183206

184207
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
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+
}

0 commit comments

Comments
 (0)