Skip to content

Commit e25eec7

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 9fe71b3 commit e25eec7

File tree

7 files changed

+320
-2
lines changed

7 files changed

+320
-2
lines changed

solution/1000-1099/1024.Video Stitching/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@
8080

8181
时间复杂度 $O(n+m)$,空间复杂度 $O(m)$。其中 $n$ 和 $m$ 分别是数组 `clips` 的长度和 `time` 的值。
8282

83+
相似题目:[1326. 灌溉花园的最少水龙头数目](/solution/1300-1399/1326.Minimum%20Number%20of%20Taps%20to%20Open%20to%20Water%20a%20Garden/README.md)
84+
8385
<!-- tabs:start -->
8486

8587
### **Python3**

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

Lines changed: 121 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,142 @@
5555

5656
<!-- 这里可写通用的实现逻辑 -->
5757

58+
**方法一:贪心**
59+
60+
注意到,对于所有能覆盖某个左端点的水龙头,选择能覆盖最远右端点的那个水龙头是最优的。
61+
62+
因此,我们可以预处理 `ranges`,对于每一个位置 $i$,左右端点分别为 `l = max(0, i-ranges[i])``r = min(n, i+ranges[i])`,我们算出所有能覆盖左端点 $l$ 的水龙头中,右端点最大的那个位置,记录在数组 $last[i]$ 中。
63+
64+
我们定义变量 `mx` 表示当前能够到达的最远位置,变量 `ans` 表示当前需要的最少子区间数,变量 `pre` 表示上一个被使用的子区间的右端点。
65+
66+
接下来,我们从 $0$ 开始枚举所有位置 $i$,用 $last[i]$ 来更新 `mx`。如果更新后 $mx = i$,说明无法覆盖下一个位置,返回 $-1$。
67+
68+
同时我们记录上一个被使用的子区间的右端点 `pre`,如果 $pre = i$,说明需要使用一个新的子区间,因此我们将 `ans` 加 $1$,并将 `pre` 更新为 `mx`
69+
70+
遍历结束后,返回 `ans` 即可。
71+
72+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为花园的长度。
73+
74+
相似题目:[1024. 视频拼接](/solution/1000-1099/1024.Video%20Stitching/README.md)
75+
5876
<!-- tabs:start -->
5977

6078
### **Python3**
6179

6280
<!-- 这里可写当前语言的特殊实现逻辑 -->
6381

6482
```python
65-
83+
class Solution:
84+
def minTaps(self, n: int, ranges: List[int]) -> int:
85+
last = [0] * (n + 1)
86+
for i, v in enumerate(ranges):
87+
l, r = max(0, i - v), min(n, i + v)
88+
last[l] = max(last[l], r)
89+
90+
ans = mx = pre = 0
91+
for i in range(n):
92+
mx = max(mx, last[i])
93+
if mx <= i:
94+
return -1
95+
if pre == i:
96+
ans += 1
97+
pre = mx
98+
return ans
6699
```
67100

68101
### **Java**
69102

70103
<!-- 这里可写当前语言的特殊实现逻辑 -->
71104

72105
```java
106+
class Solution {
107+
public int minTaps(int n, int[] ranges) {
108+
int[] last = new int[n + 1];
109+
for (int i = 0; i < n + 1; ++i) {
110+
int v = ranges[i];
111+
int l = Math.max(0, i - v), r = Math.min(n, i + v);
112+
last[l] = Math.max(last[l], r);
113+
}
114+
int ans = 0, mx = 0, pre = 0;
115+
for (int i = 0; i < n; ++i) {
116+
mx = Math.max(mx, last[i]);
117+
if (mx <= i) {
118+
return -1;
119+
}
120+
if (pre == i) {
121+
++ans;
122+
pre = mx;
123+
}
124+
}
125+
return ans;
126+
}
127+
}
128+
```
129+
130+
### **C++**
131+
132+
```cpp
133+
class Solution {
134+
public:
135+
int minTaps(int n, vector<int>& ranges) {
136+
vector<int> last(n + 1);
137+
for (int i = 0; i < n + 1; ++i) {
138+
int v = ranges[i];
139+
int l = max(0, i - v), r = min(n, i + v);
140+
last[l] = max(last[l], r);
141+
}
142+
int ans = 0, mx = 0, pre = 0;
143+
for (int i = 0; i < n; ++i) {
144+
mx = max(mx, last[i]);
145+
if (mx <= i) {
146+
return -1;
147+
}
148+
if (pre == i) {
149+
++ans;
150+
pre = mx;
151+
}
152+
}
153+
return ans;
154+
}
155+
};
156+
```
73157
158+
### **Go**
159+
160+
```go
161+
func minTaps(n int, ranges []int) int {
162+
last := make([]int, n+1)
163+
for i, v := range ranges {
164+
l, r := max(0, i-v), min(n, i+v)
165+
last[l] = max(last[l], r)
166+
}
167+
ans, mx, pre := 0, 0, 0
168+
for i := 0; i < n; i++ {
169+
mx = max(mx, last[i])
170+
if mx <= i {
171+
return -1
172+
}
173+
if pre == i {
174+
ans++
175+
pre = mx
176+
}
177+
}
178+
return ans
179+
}
180+
181+
func max(a, b int) int {
182+
if a > b {
183+
return a
184+
}
185+
return b
186+
}
187+
188+
func min(a, b int) int {
189+
if a < b {
190+
return a
191+
}
192+
return b
193+
}
74194
```
75195

76196
### **...**

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

Lines changed: 103 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,115 @@ Opening Only the second tap will water the whole garden [0,5]
5151
### **Python3**
5252

5353
```python
54-
54+
class Solution:
55+
def minTaps(self, n: int, ranges: List[int]) -> int:
56+
last = [0] * (n + 1)
57+
for i, v in enumerate(ranges):
58+
l, r = max(0, i - v), min(n, i + v)
59+
last[l] = max(last[l], r)
60+
61+
ans = mx = pre = 0
62+
for i in range(n):
63+
mx = max(mx, last[i])
64+
if mx <= i:
65+
return -1
66+
if pre == i:
67+
ans += 1
68+
pre = mx
69+
return ans
5570
```
5671

5772
### **Java**
5873

5974
```java
75+
class Solution {
76+
public int minTaps(int n, int[] ranges) {
77+
int[] last = new int[n + 1];
78+
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);
81+
last[l] = Math.max(last[l], r);
82+
}
83+
int ans = 0, mx = 0, pre = 0;
84+
for (int i = 0; i < n; ++i) {
85+
mx = Math.max(mx, last[i]);
86+
if (mx <= i) {
87+
return -1;
88+
}
89+
if (pre == i) {
90+
++ans;
91+
pre = mx;
92+
}
93+
}
94+
return ans;
95+
}
96+
}
97+
```
98+
99+
### **C++**
100+
101+
```cpp
102+
class Solution {
103+
public:
104+
int minTaps(int n, vector<int>& ranges) {
105+
vector<int> last(n + 1);
106+
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);
109+
last[l] = max(last[l], r);
110+
}
111+
int ans = 0, mx = 0, pre = 0;
112+
for (int i = 0; i < n; ++i) {
113+
mx = max(mx, last[i]);
114+
if (mx <= i) {
115+
return -1;
116+
}
117+
if (pre == i) {
118+
++ans;
119+
pre = mx;
120+
}
121+
}
122+
return ans;
123+
}
124+
};
125+
```
60126
127+
### **Go**
128+
129+
```go
130+
func minTaps(n int, ranges []int) int {
131+
last := make([]int, n+1)
132+
for i, v := range ranges {
133+
l, r := max(0, i-v), min(n, i+v)
134+
last[l] = max(last[l], r)
135+
}
136+
ans, mx, pre := 0, 0, 0
137+
for i := 0; i < n; i++ {
138+
mx = max(mx, last[i])
139+
if mx <= i {
140+
return -1
141+
}
142+
if pre == i {
143+
ans++
144+
pre = mx
145+
}
146+
}
147+
return ans
148+
}
149+
150+
func max(a, b int) int {
151+
if a > b {
152+
return a
153+
}
154+
return b
155+
}
156+
157+
func min(a, b int) int {
158+
if a < b {
159+
return a
160+
}
161+
return b
162+
}
61163
```
62164

63165
### **...**
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int minTaps(int n, vector<int>& ranges) {
4+
vector<int> last(n + 1);
5+
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);
8+
last[l] = max(last[l], r);
9+
}
10+
int ans = 0, mx = 0, pre = 0;
11+
for (int i = 0; i < n; ++i) {
12+
mx = 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+
}
23+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
func minTaps(n int, ranges []int) int {
2+
last := make([]int, n+1)
3+
for i, v := range ranges {
4+
l, r := max(0, i-v), min(n, i+v)
5+
last[l] = max(last[l], r)
6+
}
7+
ans, mx, pre := 0, 0, 0
8+
for i := 0; i < n; i++ {
9+
mx = max(mx, last[i])
10+
if mx <= i {
11+
return -1
12+
}
13+
if pre == i {
14+
ans++
15+
pre = mx
16+
}
17+
}
18+
return ans
19+
}
20+
21+
func max(a, b int) int {
22+
if a > b {
23+
return a
24+
}
25+
return b
26+
}
27+
28+
func min(a, b int) int {
29+
if a < b {
30+
return a
31+
}
32+
return b
33+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int minTaps(int n, int[] ranges) {
3+
int[] last = new int[n + 1];
4+
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);
7+
last[l] = Math.max(last[l], r);
8+
}
9+
int ans = 0, mx = 0, pre = 0;
10+
for (int i = 0; i < n; ++i) {
11+
mx = Math.max(mx, last[i]);
12+
if (mx <= i) {
13+
return -1;
14+
}
15+
if (pre == i) {
16+
++ans;
17+
pre = mx;
18+
}
19+
}
20+
return ans;
21+
}
22+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def minTaps(self, n: int, ranges: List[int]) -> int:
3+
last = [0] * (n + 1)
4+
for i, v in enumerate(ranges):
5+
l, r = max(0, i - v), min(n, i + v)
6+
last[l] = max(last[l], r)
7+
8+
ans = mx = pre = 0
9+
for i in range(n):
10+
mx = max(mx, last[i])
11+
if mx <= i:
12+
return -1
13+
if pre == i:
14+
ans += 1
15+
pre = mx
16+
return ans

0 commit comments

Comments
 (0)