Skip to content

Commit 19fadde

Browse files
committed
feat: add solutions to lc problem: No.1488
No.1488.Avoid Flood in The City
1 parent 220150c commit 19fadde

File tree

6 files changed

+322
-2
lines changed

6 files changed

+322
-2
lines changed

solution/1400-1499/1488.Avoid Flood in The City/README.md

+117-1
Original file line numberDiff line numberDiff line change
@@ -77,22 +77,138 @@
7777

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

80+
**方法一:贪心 + 二分查找**
81+
82+
将所有晴天都存入 `sunny` 数组或者有序集合中,使用哈希表 `rainy` 记录每个湖泊最近一次下雨的日期。初始化答案数组 `ans` 每个元素为 `-1`
83+
84+
遍历 `rains` 数组,对于每个下雨的日期 $i$,如果 `rainy[rains[i]]` 存在,说明该湖泊在之前下过雨,那么我们需要找到 `sunny` 数组中第一个大于 `rainy[rains[i]]` 的日期,将其替换为下雨的日期,否则说明无法阻止洪水,返回空数组。对于没下雨的日期 $i$,我们将 $i$ 存入 `sunny` 数组中,并且将 `ans[i]` 置为 `1`
85+
86+
遍历结束,返回答案数组。
87+
88+
时间复杂度 $O(n\log n)$,空间复杂度 $O(n)$。其中 $n$ 为 `rains` 数组的长度。
89+
8090
<!-- tabs:start -->
8191

8292
### **Python3**
8393

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

8696
```python
87-
97+
class Solution:
98+
def avoidFlood(self, rains: List[int]) -> List[int]:
99+
n = len(rains)
100+
ans = [-1] * n
101+
sunny = []
102+
rainy = {}
103+
for i, v in enumerate(rains):
104+
if v:
105+
if v in rainy:
106+
idx = bisect_right(sunny, rainy[v])
107+
if idx == len(sunny):
108+
return []
109+
ans[sunny.pop(idx)] = v
110+
rainy[v] = i
111+
else:
112+
sunny.append(i)
113+
ans[i] = 1
114+
return ans
88115
```
89116

90117
### **Java**
91118

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

94121
```java
122+
class Solution {
123+
public int[] avoidFlood(int[] rains) {
124+
int n = rains.length;
125+
int[] ans = new int[n];
126+
Arrays.fill(ans, -1);
127+
TreeSet<Integer> sunny = new TreeSet<>();
128+
Map<Integer, Integer> rainy = new HashMap<>();
129+
for (int i = 0; i < n; ++i) {
130+
int v = rains[i];
131+
if (v > 0) {
132+
if (rainy.containsKey(v)) {
133+
Integer t = sunny.higher(rainy.get(v));
134+
if (t == null) {
135+
return new int[0];
136+
}
137+
ans[t] = v;
138+
sunny.remove(t);
139+
}
140+
rainy.put(v, i);
141+
} else {
142+
sunny.add(i);
143+
ans[i] = 1;
144+
}
145+
}
146+
return ans;
147+
}
148+
}
149+
```
150+
151+
### **C++**
152+
153+
```cpp
154+
class Solution {
155+
public:
156+
vector<int> avoidFlood(vector<int>& rains) {
157+
int n = rains.size();
158+
vector<int> ans(n, -1);
159+
set<int> sunny;
160+
unordered_map<int, int> rainy;
161+
for (int i = 0; i < n; ++i) {
162+
int v = rains[i];
163+
if (v) {
164+
if (rainy.count(v)) {
165+
auto it = sunny.upper_bound(rainy[v]);
166+
if (it == sunny.end()) {
167+
return {};
168+
}
169+
ans[*it] = v;
170+
sunny.erase(it);
171+
}
172+
rainy[v] = i;
173+
} else {
174+
sunny.insert(i);
175+
ans[i] = 1;
176+
}
177+
}
178+
return ans;
179+
}
180+
};
181+
```
95182
183+
### **Go**
184+
185+
```go
186+
func avoidFlood(rains []int) []int {
187+
n := len(rains)
188+
ans := make([]int, n)
189+
for i := range ans {
190+
ans[i] = -1
191+
}
192+
sunny := []int{}
193+
rainy := map[int]int{}
194+
for i, v := range rains {
195+
if v > 0 {
196+
if j, ok := rainy[v]; ok {
197+
idx := sort.Search(len(sunny), func(i int) bool { return sunny[i] > j })
198+
if idx == len(sunny) {
199+
return []int{}
200+
}
201+
ans[sunny[idx]] = v
202+
sunny = append(sunny[:idx], sunny[idx+1:]...)
203+
}
204+
rainy[v] = i
205+
} else {
206+
sunny = append(sunny, i)
207+
ans[i] = 1
208+
}
209+
}
210+
return ans
211+
}
96212
```
97213

98214
### **...**

solution/1400-1499/1488.Avoid Flood in The City/README_EN.md

+107-1
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,119 @@ After that, it will rain over lakes [1,2]. It&#39;s easy to prove that no matter
7676
### **Python3**
7777

7878
```python
79-
79+
class Solution:
80+
def avoidFlood(self, rains: List[int]) -> List[int]:
81+
n = len(rains)
82+
ans = [-1] * n
83+
sunny = []
84+
rainy = {}
85+
for i, v in enumerate(rains):
86+
if v:
87+
if v in rainy:
88+
idx = bisect_right(sunny, rainy[v])
89+
if idx == len(sunny):
90+
return []
91+
ans[sunny.pop(idx)] = v
92+
rainy[v] = i
93+
else:
94+
sunny.append(i)
95+
ans[i] = 1
96+
return ans
8097
```
8198

8299
### **Java**
83100

84101
```java
102+
class Solution {
103+
public int[] avoidFlood(int[] rains) {
104+
int n = rains.length;
105+
int[] ans = new int[n];
106+
Arrays.fill(ans, -1);
107+
TreeSet<Integer> sunny = new TreeSet<>();
108+
Map<Integer, Integer> rainy = new HashMap<>();
109+
for (int i = 0; i < n; ++i) {
110+
int v = rains[i];
111+
if (v > 0) {
112+
if (rainy.containsKey(v)) {
113+
Integer t = sunny.higher(rainy.get(v));
114+
if (t == null) {
115+
return new int[0];
116+
}
117+
ans[t] = v;
118+
sunny.remove(t);
119+
}
120+
rainy.put(v, i);
121+
} else {
122+
sunny.add(i);
123+
ans[i] = 1;
124+
}
125+
}
126+
return ans;
127+
}
128+
}
129+
```
130+
131+
### **C++**
132+
133+
```cpp
134+
class Solution {
135+
public:
136+
vector<int> avoidFlood(vector<int>& rains) {
137+
int n = rains.size();
138+
vector<int> ans(n, -1);
139+
set<int> sunny;
140+
unordered_map<int, int> rainy;
141+
for (int i = 0; i < n; ++i) {
142+
int v = rains[i];
143+
if (v) {
144+
if (rainy.count(v)) {
145+
auto it = sunny.upper_bound(rainy[v]);
146+
if (it == sunny.end()) {
147+
return {};
148+
}
149+
ans[*it] = v;
150+
sunny.erase(it);
151+
}
152+
rainy[v] = i;
153+
} else {
154+
sunny.insert(i);
155+
ans[i] = 1;
156+
}
157+
}
158+
return ans;
159+
}
160+
};
161+
```
85162
163+
### **Go**
164+
165+
```go
166+
func avoidFlood(rains []int) []int {
167+
n := len(rains)
168+
ans := make([]int, n)
169+
for i := range ans {
170+
ans[i] = -1
171+
}
172+
sunny := []int{}
173+
rainy := map[int]int{}
174+
for i, v := range rains {
175+
if v > 0 {
176+
if j, ok := rainy[v]; ok {
177+
idx := sort.Search(len(sunny), func(i int) bool { return sunny[i] > j })
178+
if idx == len(sunny) {
179+
return []int{}
180+
}
181+
ans[sunny[idx]] = v
182+
sunny = append(sunny[:idx], sunny[idx+1:]...)
183+
}
184+
rainy[v] = i
185+
} else {
186+
sunny = append(sunny, i)
187+
ans[i] = 1
188+
}
189+
}
190+
return ans
191+
}
86192
```
87193

88194
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
vector<int> avoidFlood(vector<int>& rains) {
4+
int n = rains.size();
5+
vector<int> ans(n, -1);
6+
set<int> sunny;
7+
unordered_map<int, int> rainy;
8+
for (int i = 0; i < n; ++i) {
9+
int v = rains[i];
10+
if (v) {
11+
if (rainy.count(v)) {
12+
auto it = sunny.upper_bound(rainy[v]);
13+
if (it == sunny.end()) {
14+
return {};
15+
}
16+
ans[*it] = v;
17+
sunny.erase(it);
18+
}
19+
rainy[v] = i;
20+
} else {
21+
sunny.insert(i);
22+
ans[i] = 1;
23+
}
24+
}
25+
return ans;
26+
}
27+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
func avoidFlood(rains []int) []int {
2+
n := len(rains)
3+
ans := make([]int, n)
4+
for i := range ans {
5+
ans[i] = -1
6+
}
7+
sunny := []int{}
8+
rainy := map[int]int{}
9+
for i, v := range rains {
10+
if v > 0 {
11+
if j, ok := rainy[v]; ok {
12+
idx := sort.Search(len(sunny), func(i int) bool { return sunny[i] > j })
13+
if idx == len(sunny) {
14+
return []int{}
15+
}
16+
ans[sunny[idx]] = v
17+
sunny = append(sunny[:idx], sunny[idx+1:]...)
18+
}
19+
rainy[v] = i
20+
} else {
21+
sunny = append(sunny, i)
22+
ans[i] = 1
23+
}
24+
}
25+
return ans
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public int[] avoidFlood(int[] rains) {
3+
int n = rains.length;
4+
int[] ans = new int[n];
5+
Arrays.fill(ans, -1);
6+
TreeSet<Integer> sunny = new TreeSet<>();
7+
Map<Integer, Integer> rainy = new HashMap<>();
8+
for (int i = 0; i < n; ++i) {
9+
int v = rains[i];
10+
if (v > 0) {
11+
if (rainy.containsKey(v)) {
12+
Integer t = sunny.higher(rainy.get(v));
13+
if (t == null) {
14+
return new int[0];
15+
}
16+
ans[t] = v;
17+
sunny.remove(t);
18+
}
19+
rainy.put(v, i);
20+
} else {
21+
sunny.add(i);
22+
ans[i] = 1;
23+
}
24+
}
25+
return ans;
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def avoidFlood(self, rains: List[int]) -> List[int]:
3+
n = len(rains)
4+
ans = [-1] * n
5+
sunny = []
6+
rainy = {}
7+
for i, v in enumerate(rains):
8+
if v:
9+
if v in rainy:
10+
idx = bisect_right(sunny, rainy[v])
11+
if idx == len(sunny):
12+
return []
13+
ans[sunny.pop(idx)] = v
14+
rainy[v] = i
15+
else:
16+
sunny.append(i)
17+
ans[i] = 1
18+
return ans

0 commit comments

Comments
 (0)