mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 11:34:46 +08:00
Update 0042.接雨水.md
补充python备注,和规范python代码
This commit is contained in:
@ -515,20 +515,66 @@ class Solution:
|
|||||||
```python3
|
```python3
|
||||||
class Solution:
|
class Solution:
|
||||||
def trap(self, height: List[int]) -> int:
|
def trap(self, height: List[int]) -> int:
|
||||||
st =[0]
|
# 单调栈
|
||||||
|
'''
|
||||||
|
单调栈是按照 行 的方向来计算雨水
|
||||||
|
从栈顶到栈底的顺序:从小到大
|
||||||
|
通过三个元素来接水:栈顶,栈顶的下一个元素,以及即将入栈的元素
|
||||||
|
雨水高度是 min(凹槽左边高度, 凹槽右边高度) - 凹槽底部高度
|
||||||
|
雨水的宽度是 凹槽右边的下标 - 凹槽左边的下标 - 1(因为只求中间宽度)
|
||||||
|
'''
|
||||||
|
# stack储存index,用于计算对应的柱子高度
|
||||||
|
stack = [0]
|
||||||
result = 0
|
result = 0
|
||||||
for i in range(1, len(height)):
|
for i in range(1, len(height)):
|
||||||
while st!=[] and height[i]>height[st[-1]]:
|
# 情况一
|
||||||
midh = height[st[-1]]
|
if height[i] < height[stack[-1]]:
|
||||||
st.pop()
|
stack.append(i)
|
||||||
if st!=[]:
|
|
||||||
hright = height[i]
|
# 情况二
|
||||||
hleft = height[st[-1]]
|
# 当当前柱子高度和栈顶一致时,左边的一个是不可能存放雨水的,所以保留右侧新柱子
|
||||||
h = min(hright,hleft)-midh
|
# 需要使用最右边的柱子来计算宽度
|
||||||
w = i-st[-1]-1
|
elif height[i] == height[stack[-1]]:
|
||||||
|
stack.pop()
|
||||||
|
stack.append(i)
|
||||||
|
|
||||||
|
# 情况三
|
||||||
|
else:
|
||||||
|
# 抛出所有较低的柱子
|
||||||
|
while stack and height[i] > height[stack[-1]]:
|
||||||
|
# 栈顶就是中间的柱子:储水槽,就是凹槽的地步
|
||||||
|
mid_height = height[stack[-1]]
|
||||||
|
stack.pop()
|
||||||
|
if stack:
|
||||||
|
right_height = height[i]
|
||||||
|
left_height = height[stack[-1]]
|
||||||
|
# 两侧的较矮一方的高度 - 凹槽底部高度
|
||||||
|
h = min(right_height, left_height) - mid_height
|
||||||
|
# 凹槽右侧下标 - 凹槽左侧下标 - 1: 只求中间宽度
|
||||||
|
w = i - stack[-1] - 1
|
||||||
|
# 体积:高乘宽
|
||||||
result += h * w
|
result += h * w
|
||||||
st.append(i)
|
stack.append(i)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
# 单调栈压缩版
|
||||||
|
class Solution:
|
||||||
|
def trap(self, height: List[int]) -> int:
|
||||||
|
stack = [0]
|
||||||
|
result = 0
|
||||||
|
for i in range(1, len(height)):
|
||||||
|
while stack and height[i] > height[stack[-1]]:
|
||||||
|
mid_height = stack.pop()
|
||||||
|
if stack:
|
||||||
|
# 雨水高度是 min(凹槽左侧高度, 凹槽右侧高度) - 凹槽底部高度
|
||||||
|
h = min(height[stack[-1]], height[i]) - height[mid_height]
|
||||||
|
# 雨水宽度是 凹槽右侧的下标 - 凹槽左侧的下标 - 1
|
||||||
|
w = i - stack[-1] - 1
|
||||||
|
# 累计总雨水体积
|
||||||
|
result += h * w
|
||||||
|
stack.append(i)
|
||||||
|
return result
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Go:
|
Go:
|
||||||
|
Reference in New Issue
Block a user