Skip to content

Commit 4bae8fb

Browse files
committedOct 22, 2022
feat: add solutions to lc problem: No.2086
No.2086.Minimum Number of Buckets Required to Collect Rainwater from Houses
1 parent 393242a commit 4bae8fb

File tree

6 files changed

+180
-61
lines changed

6 files changed

+180
-61
lines changed
 

‎solution/2000-2099/2086.Minimum Number of Buckets Required to Collect Rainwater from Houses/README.md

+67-20
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@
7676

7777
<!-- 这里可写通用的实现逻辑 -->
7878

79+
**方法一:贪心**
80+
81+
从左到右遍历字符串,遇到 `H` 时,优先考虑右边是否有空位,如果有则放置水桶,并且跳过水桶的下一个位置;如果右边没有空位,则考虑左边是否有空位,如果有则放置水桶,否则无解。
82+
83+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为字符串 `street` 的长度。
84+
7985
<!-- tabs:start -->
8086

8187
### **Python3**
@@ -85,19 +91,18 @@
8591
```python
8692
class Solution:
8793
def minimumBuckets(self, street: str) -> int:
88-
n, last = len(street), -2
8994
ans = 0
90-
for i, v in enumerate(street):
91-
if v == 'H':
92-
if last == i - 1:
93-
continue
95+
i, n = 0, len(street)
96+
while i < n:
97+
if street[i] == 'H':
9498
if i + 1 < n and street[i + 1] == '.':
95-
last = i + 1
96-
elif i - 1 >= 0 and street[i - 1] == '.':
97-
last = i - 1
99+
i += 2
100+
ans += 1
101+
elif i and street[i - 1] == '.':
102+
ans += 1
98103
else:
99104
return -1
100-
ans += 1
105+
i += 1
101106
return ans
102107
```
103108

@@ -108,29 +113,71 @@ class Solution:
108113
```java
109114
class Solution {
110115
public int minimumBuckets(String street) {
111-
int last = -2, n = street.length();
116+
int n = street.length();
112117
int ans = 0;
113-
for (int i = 0; i < n; i++) {
114-
char c = street.charAt(i);
115-
if (c == 'H') {
116-
if (last == i - 1) {
117-
continue;
118-
}
118+
for (int i = 0; i < n; ++i) {
119+
if (street.charAt(i) == 'H') {
119120
if (i + 1 < n && street.charAt(i + 1) == '.') {
120-
last = i + 1;
121-
} else if (i - 1 >= 0 && street.charAt(i - 1) == '.') {
122-
last = i - 1;
121+
++ans;
122+
i += 2;
123+
} else if (i > 0 && street.charAt(i - 1) == '.') {
124+
++ans;
123125
} else {
124126
return -1;
125127
}
126-
ans++;
127128
}
128129
}
129130
return ans;
130131
}
131132
}
132133
```
133134

135+
### **C++**
136+
137+
```cpp
138+
class Solution {
139+
public:
140+
int minimumBuckets(string street) {
141+
int n = street.size();
142+
int ans = 0;
143+
for (int i = 0; i < n; ++i) {
144+
if (street[i] == 'H') {
145+
if (i + 1 < n && street[i + 1] == '.') {
146+
++ans;
147+
i += 2;
148+
} else if (i && street[i - 1] == '.') {
149+
++ans;
150+
} else {
151+
return -1;
152+
}
153+
}
154+
}
155+
return ans;
156+
}
157+
};
158+
```
159+
160+
### **Go**
161+
162+
```go
163+
func minimumBuckets(street string) int {
164+
ans, n := 0, len(street)
165+
for i := 0; i < n; i++ {
166+
if street[i] == 'H' {
167+
if i+1 < n && street[i+1] == '.' {
168+
ans++
169+
i += 2
170+
} else if i > 0 && street[i-1] == '.' {
171+
ans++
172+
} else {
173+
return -1
174+
}
175+
}
176+
}
177+
return ans
178+
}
179+
```
180+
134181
### **...**
135182

136183
```

‎solution/2000-2099/2086.Minimum Number of Buckets Required to Collect Rainwater from Houses/README_EN.md

+61-20
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,18 @@ Thus, it is impossible to collect the rainwater from all the houses.
6262
```python
6363
class Solution:
6464
def minimumBuckets(self, street: str) -> int:
65-
n, last = len(street), -2
6665
ans = 0
67-
for i, v in enumerate(street):
68-
if v == 'H':
69-
if last == i - 1:
70-
continue
66+
i, n = 0, len(street)
67+
while i < n:
68+
if street[i] == 'H':
7169
if i + 1 < n and street[i + 1] == '.':
72-
last = i + 1
73-
elif i - 1 >= 0 and street[i - 1] == '.':
74-
last = i - 1
70+
i += 2
71+
ans += 1
72+
elif i and street[i - 1] == '.':
73+
ans += 1
7574
else:
7675
return -1
77-
ans += 1
76+
i += 1
7877
return ans
7978
```
8079

@@ -83,26 +82,68 @@ class Solution:
8382
```java
8483
class Solution {
8584
public int minimumBuckets(String street) {
86-
int last = -2, n = street.length();
85+
int n = street.length();
8786
int ans = 0;
88-
for (int i = 0; i < n; i++) {
89-
char c = street.charAt(i);
90-
if (c == 'H') {
91-
if (last == i - 1) {
92-
continue;
93-
}
87+
for (int i = 0; i < n; ++i) {
88+
if (street.charAt(i) == 'H') {
9489
if (i + 1 < n && street.charAt(i + 1) == '.') {
95-
last = i + 1;
96-
} else if (i - 1 >= 0 && street.charAt(i - 1) == '.') {
97-
last = i - 1;
90+
++ans;
91+
i += 2;
92+
} else if (i > 0 && street.charAt(i - 1) == '.') {
93+
++ans;
94+
} else {
95+
return -1;
96+
}
97+
}
98+
}
99+
return ans;
100+
}
101+
}
102+
```
103+
104+
### **C++**
105+
106+
```cpp
107+
class Solution {
108+
public:
109+
int minimumBuckets(string street) {
110+
int n = street.size();
111+
int ans = 0;
112+
for (int i = 0; i < n; ++i) {
113+
if (street[i] == 'H') {
114+
if (i + 1 < n && street[i + 1] == '.') {
115+
++ans;
116+
i += 2;
117+
} else if (i && street[i - 1] == '.') {
118+
++ans;
98119
} else {
99120
return -1;
100121
}
101-
ans++;
102122
}
103123
}
104124
return ans;
105125
}
126+
};
127+
```
128+
129+
### **Go**
130+
131+
```go
132+
func minimumBuckets(street string) int {
133+
ans, n := 0, len(street)
134+
for i := 0; i < n; i++ {
135+
if street[i] == 'H' {
136+
if i+1 < n && street[i+1] == '.' {
137+
ans++
138+
i += 2
139+
} else if i > 0 && street[i-1] == '.' {
140+
ans++
141+
} else {
142+
return -1
143+
}
144+
}
145+
}
146+
return ans
106147
}
107148
```
108149

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
public:
3+
int minimumBuckets(string street) {
4+
int n = street.size();
5+
int ans = 0;
6+
for (int i = 0; i < n; ++i) {
7+
if (street[i] == 'H') {
8+
if (i + 1 < n && street[i + 1] == '.') {
9+
++ans;
10+
i += 2;
11+
} else if (i && street[i - 1] == '.') {
12+
++ans;
13+
} else {
14+
return -1;
15+
}
16+
}
17+
}
18+
return ans;
19+
}
20+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
func minimumBuckets(street string) int {
2+
ans, n := 0, len(street)
3+
for i := 0; i < n; i++ {
4+
if street[i] == 'H' {
5+
if i+1 < n && street[i+1] == '.' {
6+
ans++
7+
i += 2
8+
} else if i > 0 && street[i-1] == '.' {
9+
ans++
10+
} else {
11+
return -1
12+
}
13+
}
14+
}
15+
return ans
16+
}
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
class Solution {
22
public int minimumBuckets(String street) {
3-
int last = -2, n = street.length();
3+
int n = street.length();
44
int ans = 0;
5-
for (int i = 0; i < n; i++) {
6-
char c = street.charAt(i);
7-
if (c == 'H') {
8-
if (last == i - 1) {
9-
continue;
10-
}
5+
for (int i = 0; i < n; ++i) {
6+
if (street.charAt(i) == 'H') {
117
if (i + 1 < n && street.charAt(i + 1) == '.') {
12-
last = i + 1;
13-
} else if (i - 1 >= 0 && street.charAt(i - 1) == '.') {
14-
last = i - 1;
8+
++ans;
9+
i += 2;
10+
} else if (i > 0 && street.charAt(i - 1) == '.') {
11+
++ans;
1512
} else {
1613
return -1;
1714
}
18-
ans++;
1915
}
2016
}
2117
return ans;
2218
}
23-
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
class Solution:
22
def minimumBuckets(self, street: str) -> int:
3-
n, last = len(street), -2
43
ans = 0
5-
for i, v in enumerate(street):
6-
if v == 'H':
7-
if last == i - 1:
8-
continue
4+
i, n = 0, len(street)
5+
while i < n:
6+
if street[i] == 'H':
97
if i + 1 < n and street[i + 1] == '.':
10-
last = i + 1
11-
elif i - 1 >= 0 and street[i - 1] == '.':
12-
last = i - 1
8+
i += 2
9+
ans += 1
10+
elif i and street[i - 1] == '.':
11+
ans += 1
1312
else:
1413
return -1
15-
ans += 1
14+
i += 1
1615
return ans

0 commit comments

Comments
 (0)
Please sign in to comment.