Skip to content

Commit 19a2192

Browse files
committed
feat: add solutions to lc problem: No.1326
No.1326.Minimum Number of Taps to Open to Water a Garden
1 parent 4bf73c4 commit 19a2192

File tree

7 files changed

+116
-62
lines changed

7 files changed

+116
-62
lines changed

solution/1300-1399/1326.Minimum Number of Taps to Open to Water a Garden/README.md

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,22 @@
5757

5858
**方法一:贪心**
5959

60-
注意到,对于所有能覆盖某个左端点的水龙头,选择能覆盖最远右端点的那个水龙头是最优的。
60+
我们注意到,对于所有能覆盖某个左端点的水龙头,选择能覆盖最远右端点的那个水龙头是最优的。
6161

62-
因此,我们可以预处理 `ranges`,对于每一个位置 $i$,左右端点分别为 `l = max(0, i-ranges[i])``r = min(n, i+ranges[i])`,我们算出所有能覆盖左端点 $l$ 的水龙头中,右端点最大的那个位置,记录在数组 $last[i]$ 中。
62+
因此,我们可以先预处理数组 $ranges$,对于第 $i$ 个水龙头,它能覆盖的左端点 $l = max(0, i - ranges[i])$,右端点 $r = i + ranges[i]$,我们算出所有能覆盖左端点 $l$ 的水龙头中,右端点最大的那个位置,记录在数组 $last[i]$ 中。
6363

64-
我们定义变量 `mx` 表示当前能够到达的最远位置,变量 `ans` 表示当前需要的最少子区间数,变量 `pre` 表示上一个被使用的子区间的右端点。
64+
然后我们定义以下三个变量,其中:
6565

66-
接下来,我们从 $0$ 开始枚举所有位置 $i$,用 $last[i]$ 来更新 `mx`。如果更新后 $mx = i$,说明无法覆盖下一个位置,返回 $-1$。
66+
- 变量 $ans$ 表示最终答案,即最少水龙头数目;
67+
- 变量 $mx$ 表示当前能覆盖的最远右端点;
68+
- 变量 $pre$ 表示上一个水龙头覆盖的最远右端点。
6769

68-
同时我们记录上一个被使用的子区间的右端点 `pre`,如果 $pre = i$,说明需要使用一个新的子区间,因此我们将 `ans` 加 $1$,并将 `pre` 更新为 `mx`
70+
我们在 $[0,...n-1]$ 的范围内遍历所有位置,对于当前位置 $i$,我们用 $last[i]$ 更新 $mx$,即 $mx = max(mx, last[i])$
6971

70-
遍历结束后,返回 `ans` 即可。
72+
- 如果 $mx \leq i$,说明无法覆盖下一个位置,返回 $-1$。
73+
- 如果 $pre = i$,说明需要使用一个新的子区间,因此我们将 $ans$ 加 $1$,并且更新 $pre = mx$。
74+
75+
遍历结束后,返回 $ans$ 即可。
7176

7277
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为花园的长度。
7378

@@ -87,8 +92,8 @@
8792
class Solution:
8893
def minTaps(self, n: int, ranges: List[int]) -> int:
8994
last = [0] * (n + 1)
90-
for i, v in enumerate(ranges):
91-
l, r = max(0, i - v), min(n, i + v)
95+
for i, x in enumerate(ranges):
96+
l, r = max(0, i - x), i + x
9297
last[l] = max(last[l], r)
9398

9499
ans = mx = pre = 0
@@ -111,8 +116,7 @@ class Solution {
111116
public int minTaps(int n, int[] ranges) {
112117
int[] last = new int[n + 1];
113118
for (int i = 0; i < n + 1; ++i) {
114-
int v = ranges[i];
115-
int l = Math.max(0, i - v), r = Math.min(n, i + v);
119+
int l = Math.max(0, i - ranges[i]), r = i + ranges[i];
116120
last[l] = Math.max(last[l], r);
117121
}
118122
int ans = 0, mx = 0, pre = 0;
@@ -139,8 +143,7 @@ public:
139143
int minTaps(int n, vector<int>& ranges) {
140144
vector<int> last(n + 1);
141145
for (int i = 0; i < n + 1; ++i) {
142-
int v = ranges[i];
143-
int l = max(0, i - v), r = min(n, i + v);
146+
int l = max(0, i - ranges[i]), r = i + ranges[i];
144147
last[l] = max(last[l], r);
145148
}
146149
int ans = 0, mx = 0, pre = 0;
@@ -162,15 +165,15 @@ public:
162165
### **Go**
163166
164167
```go
165-
func minTaps(n int, ranges []int) int {
168+
func minTaps(n int, ranges []int) (ans int) {
166169
last := make([]int, n+1)
167-
for i, v := range ranges {
168-
l, r := max(0, i-v), min(n, i+v)
170+
for i, x := range ranges {
171+
l, r := max(0, i-x), i+x
169172
last[l] = max(last[l], r)
170173
}
171-
ans, mx, pre := 0, 0, 0
172-
for i := 0; i < n; i++ {
173-
mx = max(mx, last[i])
174+
var pre, mx int
175+
for i, j := range last[:n] {
176+
mx = max(mx, j)
174177
if mx <= i {
175178
return -1
176179
}
@@ -179,7 +182,7 @@ func minTaps(n int, ranges []int) int {
179182
pre = mx
180183
}
181184
}
182-
return ans
185+
return
183186
}
184187
185188
func max(a, b int) int {
@@ -188,12 +191,32 @@ func max(a, b int) int {
188191
}
189192
return b
190193
}
194+
```
191195

192-
func min(a, b int) int {
193-
if a < b {
194-
return a
195-
}
196-
return b
196+
### **TypeScript**
197+
198+
```ts
199+
function minTaps(n: number, ranges: number[]): number {
200+
const last = new Array(n + 1).fill(0);
201+
for (let i = 0; i < n + 1; ++i) {
202+
const l = Math.max(0, i - ranges[i]);
203+
const r = i + ranges[i];
204+
last[l] = Math.max(last[l], r);
205+
}
206+
let ans = 0;
207+
let mx = 0;
208+
let pre = 0;
209+
for (let i = 0; i < n; ++i) {
210+
mx = Math.max(mx, last[i]);
211+
if (mx <= i) {
212+
return -1;
213+
}
214+
if (pre == i) {
215+
++ans;
216+
pre = mx;
217+
}
218+
}
219+
return ans;
197220
}
198221
```
199222

solution/1300-1399/1326.Minimum Number of Taps to Open to Water a Garden/README_EN.md

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ Opening Only the second tap will water the whole garden [0,5]
5454
class Solution:
5555
def minTaps(self, n: int, ranges: List[int]) -> int:
5656
last = [0] * (n + 1)
57-
for i, v in enumerate(ranges):
58-
l, r = max(0, i - v), min(n, i + v)
57+
for i, x in enumerate(ranges):
58+
l, r = max(0, i - x), i + x
5959
last[l] = max(last[l], r)
6060

6161
ans = mx = pre = 0
@@ -76,8 +76,7 @@ class Solution {
7676
public int minTaps(int n, int[] ranges) {
7777
int[] last = new int[n + 1];
7878
for (int i = 0; i < n + 1; ++i) {
79-
int v = ranges[i];
80-
int l = Math.max(0, i - v), r = Math.min(n, i + v);
79+
int l = Math.max(0, i - ranges[i]), r = i + ranges[i];
8180
last[l] = Math.max(last[l], r);
8281
}
8382
int ans = 0, mx = 0, pre = 0;
@@ -104,8 +103,7 @@ public:
104103
int minTaps(int n, vector<int>& ranges) {
105104
vector<int> last(n + 1);
106105
for (int i = 0; i < n + 1; ++i) {
107-
int v = ranges[i];
108-
int l = max(0, i - v), r = min(n, i + v);
106+
int l = max(0, i - ranges[i]), r = i + ranges[i];
109107
last[l] = max(last[l], r);
110108
}
111109
int ans = 0, mx = 0, pre = 0;
@@ -127,15 +125,15 @@ public:
127125
### **Go**
128126
129127
```go
130-
func minTaps(n int, ranges []int) int {
128+
func minTaps(n int, ranges []int) (ans int) {
131129
last := make([]int, n+1)
132-
for i, v := range ranges {
133-
l, r := max(0, i-v), min(n, i+v)
130+
for i, x := range ranges {
131+
l, r := max(0, i-x), i+x
134132
last[l] = max(last[l], r)
135133
}
136-
ans, mx, pre := 0, 0, 0
137-
for i := 0; i < n; i++ {
138-
mx = max(mx, last[i])
134+
var pre, mx int
135+
for i, j := range last[:n] {
136+
mx = max(mx, j)
139137
if mx <= i {
140138
return -1
141139
}
@@ -144,7 +142,7 @@ func minTaps(n int, ranges []int) int {
144142
pre = mx
145143
}
146144
}
147-
return ans
145+
return
148146
}
149147
150148
func max(a, b int) int {
@@ -153,12 +151,32 @@ func max(a, b int) int {
153151
}
154152
return b
155153
}
154+
```
156155

157-
func min(a, b int) int {
158-
if a < b {
159-
return a
160-
}
161-
return b
156+
### **TypeScript**
157+
158+
```ts
159+
function minTaps(n: number, ranges: number[]): number {
160+
const last = new Array(n + 1).fill(0);
161+
for (let i = 0; i < n + 1; ++i) {
162+
const l = Math.max(0, i - ranges[i]);
163+
const r = i + ranges[i];
164+
last[l] = Math.max(last[l], r);
165+
}
166+
let ans = 0;
167+
let mx = 0;
168+
let pre = 0;
169+
for (let i = 0; i < n; ++i) {
170+
mx = Math.max(mx, last[i]);
171+
if (mx <= i) {
172+
return -1;
173+
}
174+
if (pre == i) {
175+
++ans;
176+
pre = mx;
177+
}
178+
}
179+
return ans;
162180
}
163181
```
164182

solution/1300-1399/1326.Minimum Number of Taps to Open to Water a Garden/Solution.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ class Solution {
33
int minTaps(int n, vector<int>& ranges) {
44
vector<int> last(n + 1);
55
for (int i = 0; i < n + 1; ++i) {
6-
int v = ranges[i];
7-
int l = max(0, i - v), r = min(n, i + v);
6+
int l = max(0, i - ranges[i]), r = i + ranges[i];
87
last[l] = max(last[l], r);
98
}
109
int ans = 0, mx = 0, pre = 0;
Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
func minTaps(n int, ranges []int) int {
1+
func minTaps(n int, ranges []int) (ans int) {
22
last := make([]int, n+1)
3-
for i, v := range ranges {
4-
l, r := max(0, i-v), min(n, i+v)
3+
for i, x := range ranges {
4+
l, r := max(0, i-x), i+x
55
last[l] = max(last[l], r)
66
}
7-
ans, mx, pre := 0, 0, 0
8-
for i := 0; i < n; i++ {
9-
mx = max(mx, last[i])
7+
var pre, mx int
8+
for i, j := range last[:n] {
9+
mx = max(mx, j)
1010
if mx <= i {
1111
return -1
1212
}
@@ -15,19 +15,12 @@ func minTaps(n int, ranges []int) int {
1515
pre = mx
1616
}
1717
}
18-
return ans
18+
return
1919
}
2020

2121
func max(a, b int) int {
2222
if a > b {
2323
return a
2424
}
2525
return b
26-
}
27-
28-
func min(a, b int) int {
29-
if a < b {
30-
return a
31-
}
32-
return b
3326
}

solution/1300-1399/1326.Minimum Number of Taps to Open to Water a Garden/Solution.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ class Solution {
22
public int minTaps(int n, int[] ranges) {
33
int[] last = new int[n + 1];
44
for (int i = 0; i < n + 1; ++i) {
5-
int v = ranges[i];
6-
int l = Math.max(0, i - v), r = Math.min(n, i + v);
5+
int l = Math.max(0, i - ranges[i]), r = i + ranges[i];
76
last[l] = Math.max(last[l], r);
87
}
98
int ans = 0, mx = 0, pre = 0;

solution/1300-1399/1326.Minimum Number of Taps to Open to Water a Garden/Solution.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
class Solution:
22
def minTaps(self, n: int, ranges: List[int]) -> int:
33
last = [0] * (n + 1)
4-
for i, v in enumerate(ranges):
5-
l, r = max(0, i - v), min(n, i + v)
4+
for i, x in enumerate(ranges):
5+
l, r = max(0, i - x), i + x
66
last[l] = max(last[l], r)
77

88
ans = mx = pre = 0
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
function minTaps(n: number, ranges: number[]): number {
2+
const last = new Array(n + 1).fill(0);
3+
for (let i = 0; i < n + 1; ++i) {
4+
const l = Math.max(0, i - ranges[i]);
5+
const r = i + ranges[i];
6+
last[l] = Math.max(last[l], r);
7+
}
8+
let ans = 0;
9+
let mx = 0;
10+
let pre = 0;
11+
for (let i = 0; i < n; ++i) {
12+
mx = Math.max(mx, last[i]);
13+
if (mx <= i) {
14+
return -1;
15+
}
16+
if (pre == i) {
17+
++ans;
18+
pre = mx;
19+
}
20+
}
21+
return ans;
22+
}

0 commit comments

Comments
 (0)