42. 接雨水
python
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
res = 0
st = []
for i in range(len(height)):
while st and height[i]>height[st[-1]]:
cur = st.pop()
if not st:
break # 左边没有墙,无法接雨水
left = st[-1] # 这里不弹出,只是作为左侧的墙,用于承接
res += (min(height[left],height[i])-height[cur])*(i-left-1)
if st and height[i]==height[st[-1]]:
st.pop() # 相等情况下,高度为0,接不了雨水
st.append(i)
return res
84. 最大矩形
python
class Solution(object):
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
nums = [0] + heights + [0] # 如果最后的单调递增,尾部加0;为了第一个子元素可以正常计算,首部加0
res = []
st = []
for i in range(len(nums)):
while st and nums[i] < nums[st[-1]]:
cur = st.pop()
if not st:
break
left = st[-1]
s = nums[cur]*(i-left-1)
res.append(s)
st.append(i)
return max(res) if res else 0