|
77 | 77 |
|
78 | 78 | <!-- 这里可写通用的实现逻辑 -->
|
79 | 79 |
|
| 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 | + |
80 | 90 | <!-- tabs:start -->
|
81 | 91 |
|
82 | 92 | ### **Python3**
|
83 | 93 |
|
84 | 94 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
85 | 95 |
|
86 | 96 | ```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 |
88 | 115 | ```
|
89 | 116 |
|
90 | 117 | ### **Java**
|
91 | 118 |
|
92 | 119 | <!-- 这里可写当前语言的特殊实现逻辑 -->
|
93 | 120 |
|
94 | 121 | ```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 | +``` |
95 | 182 |
|
| 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 | +} |
96 | 212 | ```
|
97 | 213 |
|
98 | 214 | ### **...**
|
|
0 commit comments