引言
接雨水问题是一个经典的算法问题,它要求我们计算给定一组不同高度的墙壁时,这些墙壁之间能够蓄积多少雨水。解决这个问题的方法有很多,其中一种常见的解法是通过辅助数组来记录每个位置的左右最大高度,并计算每个位置上方能够蓄积的雨水量。
问题描述
假设我们有一个非负整数数组height
,其中每个元素表示墙壁的高度。我们需要计算这些墙壁之间能够蓄积多少雨水。
题目链接:. - 力扣(LeetCode)
思路:辅助数组法
接下来,我们将介绍一种解决接雨水问题的常见方法,即通过辅助数组来记录每个位置的左右最大高度,并计算每个位置上方能够蓄积的雨水量。
python代码
python
class Solution:
def trap(self, height: List[int]) -> int:
# left, right 分别存储一点左,右边最高墙壁
left=[]
right=[]
#ans为返回值
ans=0
lmax, rmax=0,0
left.append(0)
for i in range(1,len(height)):
lmax=max(lmax, height[i-1])
left.append(lmax)
right.append(0)
for i in range(len(height)-2, -1, -1):
rmax=max(rmax, height[i+1])
right.append(rmax)
right=right[::-1]
print(f"left={left}")
print(f"righ={right}")
for i in range(len(height)):
ans+=max(0, min(left[i], right[i])-height[i])
return ans
详细步骤解释:
- 我们首先创建了两个辅助数组
left
和right
,用于分别存储每个位置的左侧和右侧最大高度。 - 然后我们通过遍历数组,计算每个位置的左侧最大高度,并将结果存入
left
数组中。 - 接着,我们通过逆序遍历数组,计算每个位置的右侧最大高度,并将结果存入
right
数组中。 - 将
right
数组进行反转,以便与left
数组对应位置进行比较。 - 最后,我们再次遍历数组,计算每个位置上方能够蓄积的雨水量,并累加到变量
ans
中。 - 最终,我们返回计算得到的雨水总量
ans
作为结果。
示例与分析: 假设我们有一个高度数组[0,1,0,2,1,0,1,3,2,1,2,1]
,使用上述算法进行计算可以得到结果为6
。具体的计算过程如下:
python
height=[0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
left = [0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
right = [3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 1, 0]
#计算每个位置上方能够蓄积的雨水量:
[0, 0, 1, 0, 1, 2, 1, 0, 1, 0, 0, 0]
从示例中可以看出,计算得到的雨水总量为6
,即该数组表示的墙壁之间能够蓄积的雨水量。
复杂度分析:
- 时间复杂度:该算法需要遍历两次输入数组,分别计算左右最大高度,以及遍历一次数组计算每个位置上方的雨水量。因此,时间复杂度为O(n),其中n是输入数组的长度。
- 空间复杂度:该算法使用了两个额外的辅助数组
left
和right
,它们的长度与输入数组相同。因此,空间复杂度为O(n)。
结论: 通过辅助数组法,我们可以有效地解决接雨水问题。该方法利用了辅助数组存储每个位置的左右最大高度,并通过遍历数组计算每个位置上方能够蓄积的雨水量。这种方法简单、直观,并且具有较好的时间复杂度和空间复杂度。
展望: 除了辅助数组法之外,还有其他解决接雨水问题的方法。例如,可以使用双指针法、栈等数据结构来解决该问题。在未来的研究和实践中,我们可以进一步探究这些方法,并比较它们的优缺点,以寻找更加高效的解决方案。
详细题解:. - 力扣(LeetCode)