LeetCode //42. Trapping Rain Water
发布人:shili8
发布时间:2025-01-15 15:09
阅读次数:0
**题目描述**
给定一个高度数组,代表一列柱子,每个柱子的高度表示其高度。请找出能容纳多少雨水。
**示例1:**
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6**示例2:**
输入:height = [4,2,0,3,2,5]
输出:9**解决方案**
这个问题可以使用双指针技术来解决。我们维护两个指针,一个从左边开始,一个从右边开始。每次移动其中一个指针时,我们都会检查当前柱子的高度是否大于或等于其他柱子中的最大高度。如果是,则更新对应的最大高度。
**代码实现**
def trap(height): """ 计算能容纳多少雨水 Args: height (list): 高度数组 Returns: int: 能容纳的雨水量 """ if not height: return0 # 初始化两个指针和最大高度 left, right =0, len(height) -1 max_left, max_right = height[left], height[right] # 计算能容纳的雨水量 water =0 while left < right: # 如果左边柱子的高度小于右边柱子的高度,则移动左边指针 if height[left] < height[right]: # 如果当前柱子高于最大左边高度,则更新最大左边高度 if height[left] > max_left: max_left = height[left] else: # 否则,计算能容纳的雨水量 water += max_left - height[left] left +=1 else: # 如果右边柱子的高度小于左边柱子的高度,则移动右边指针 if height[right] > max_right: max_right = height[right] else: # 否则,计算能容纳的雨水量 water += max_right - height[right] right -=1 return water
**注释**
* `height` 是高度数组。
* `left` 和 `right` 是两个指针,分别从左边和右边开始。
* `max_left` 和 `max_right` 是当前最大高度。
* `water` 是能容纳的雨水量。
**示例用法**
height = [0,1,0,2,1,0,1,3,2,1,2,1] print(trap(height)) # 输出:6height = [4,2,0,3,2,5] print(trap(height)) # 输出:9
**时间复杂度**
* 最坏情况下,时间复杂度为 O(n),其中 n 是高度数组的长度。
**空间复杂度**
* 空间复杂度为 O(1)。