题目描述: 给定一个数组,其中第 i 个元素表示某个地方的高度。假设它下雨了,地面积满了水,请计算出它能够接住多少雨水。 示例: 输入: 输出: 6 解释:在位置2、3、5、6、8、10处可以接住雨水,因此总共能接住6个单位的雨水。 思路: 这道题可以用单调栈来解决。具体做法如下: 从左到右遍历数组,对于每个元素,如果栈为空或者当前元素小于等于栈顶元素,则将当前元素入栈。 否则,弹出栈顶元素,直到栈为空或者当前元素小于等于栈顶元素。每次弹出栈顶元素时,计算当前元素与弹出元素之间形成的凹槽可以容纳的雨水量,并将结果累加到答案中。 将当前元素入栈。 从右到左再执行一遍上述过程,得到从右到左的答案。 最终答案即为从左到右和从右到左的答案之和。代码实现
时间: 2023-12-06 17:39:43 浏览: 149
以下是Python实现代码:
```python
def trap(height):
if not height:
return 0
n = len(height)
left_stack = []
right_stack = []
ans = 0
# 从左到右遍历
for i in range(n):
while left_stack and height[i] > height[left_stack[-1]]:
top = left_stack.pop()
if not left_stack:
break
distance = i - left_stack[-1] - 1
bounded_height = min(height[i], height[left_stack[-1]]) - height[top]
ans += distance * bounded_height
left_stack.append(i)
# 从右到左遍历
for i in range(n-1, -1, -1):
while right_stack and height[i] > height[right_stack[-1]]:
top = right_stack.pop()
if not right_stack:
break
distance = right_stack[-1] - i - 1
bounded_height = min(height[i], height[right_stack[-1]]) - height[top]
ans += distance * bounded_height
right_stack.append(i)
return ans
```
其中left_stack和right_stack分别为从左到右和从右到左的单调栈,代码中注释已经说明了具体实现。
阅读全文