一维接雨水算法题实现
https://leetcode-cn.com/problems/trapping-rain-water/
def trap_rain_water(height):
# 思路: 一个格子能不能接到雨水,能接到多少雨水,由其两边最高的"墙"决定
# 从第二个位置遍历每个格子,遍历到倒数第二个,找到每个格子两边最高的墙
# 格子高于等于墙高则无法接住雨水,如果比墙低,则能接住较低的墙减去格子高度的雨水
# 将每个格子接到的雨水加起来,遍历完成后即为总的雨水量
if not height:
return 0
rain_water_count = 0
left_max = height[0]
right_max = max(height[1:])
for index, high in enumerate(height[1: -1], 1):
if left_max < high:
left_max = high
if high == right_max:
right_max = max(height[index + 1:])
continue
if high == right_max:
right_max = max(height[index + 1:])
continue
if left_max > high and right_max > high:
lower_wall = left_max if left_max < right_max else right_max
rain_water_count += lower_wall - high
return rain_water_count
if __name__ == '__main__':
ret = trap_rain_water2([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1])
print(ret)
ret = trap_rain_water([4, 2, 0, 3, 2, 5])
print(ret)
二维接雨水算法实现
https://leetcode-cn.com/problems/trapping-rain-water-ii/submissions/
思路1,正向思路
- 最外圈格子一定接不到雨水,可将最外圈看着围墙,所有从内圈开始遍历每个格子
- 遍历到格子A时,查看其四个方向上的高度是否高于A的高度,如果第一个方向高于A,则这个方向遍历完并将高度记录下来
- 如果第二个方向比A低或高度相等,则判定第二个方向是否为边界,如果是边界则格子A定不能接到水,将格子A标记为核对完成
- 如果第二个方向比A低或高度相等,且不为边界,则从第二个方向的格子B想剩余的三个方向比较(因其中的一个方向是A,不能倒回去比较)
- 重复上诉两部,直到遍历到能确认格子A能不能接到水
- A不能接到水的,则A遍历过的足迹上,所有高于等于A的格子一定不能接到水,将之全部标记为核对完成
- A能接到水的,计算A接到的水量,A遍历过的足迹上所有第二等于A的都能接到水并计算水量
- 遍历完成所有内圈格子后,核对有没有格子接到水,如果没有则遍历完成,如果有则继续第二次遍历,后续的遍历可直接跳过核对完成的格子
class Solution(object):
def createFullStateMap(self, heightMap):
full_state_map = []
for row in heightMap:
full_state_map.append([False] * len(row))
first_row = full_stat

本文详细介绍了两种接雨水算法的实现:一维接雨水算法和二维接雨水算法。一维算法通过遍历每个格子,确定其能接住的雨水量;二维算法则采用正向和逆向思路,分别遍历每个格子,计算其能接住的雨水。两种方法都涉及到对周围格子高度的比较和遍历,旨在最大化收集雨水的容量。
最低0.47元/天 解锁文章
777

被折叠的 条评论
为什么被折叠?



