接雨水
仅学习
一、问题描述
二、解调思路
这个问题是一个典型的双指针问题,也称为"接雨水问题"。我们可以通过遍历数组两次来解决这个问题:一次从左到右,一次从右到左,分别记录每个位置左边和右边的最大高度。然后,可以计算每个柱子能够接住的雨水量,即两边较小的最大高度减去当前柱子的高度,如果这个值大于0,则表示可以接住雨水。
三、代码
def trap(height): if not height: return 0 n = len(height) left_max = [0] * n right_max = [0] * n water_trapped = 0 # 从左到右找到每个位置左边的最大高度 left_max[0] = height[0] for i in range(1, n): left_max[i] = max(left_max[i - 1], height[i]) # 从右到左找到每个位置右边的最大高度 right_max[n - 1] = height[n - 1] for i in range(n - 2, -1, -1): right_max[i] = max(right_max[i + 1], height[i]) # 计算雨水量 for i in range(n): water_trapped += min(left_max[i], right_max[i]) - height[i] return water_trapped # 示例 print(trap([0,1,0,2,1,0,1,3,2,1,2,1])) # 输出:6 print(trap([4,2,0,3,2,5])) # 输出:9
这段代码首先定义了一个函数trap,它接受一个表示柱子高度的列表。然后,使用两个数组left_max和right_max来分别存储每个位置左边和右边的最大高度。接着,遍历这个列表两次,一次从左到右,一次从右到左,填充这两个数组。最后,遍历原始的height列表,计算每个位置能够接住的雨水量,并将它们累加起来得到最终的结果。