题目详见 42.接雨水 题目难点 应该采用什么样的解题方法解决? 解题思路 采用单调栈的方法,按照行的方向来接取雨水单调栈特点是栈底------->栈顶是单调递减的如果当前元素大于栈顶元素的话,这就天然形成了一个凹槽,例如 栈中53 当前元素是6,行程的536则表示一个凹槽凹槽能存水多少取决于左右两侧那一侧比较小如果当前元素等于栈顶元素,则栈顶元素弹出,当前元素入栈,例如55 31 Talk is cheap,show me the code class Solution: def trap(self, height: List[int]) -> int: # 单调栈 ''' 单调栈是按照行的方向来计算雨水 从栈底---->栈顶是单调增 如果当前元素大于栈顶元素 此时就行程一个凹槽 如果当前元素等于栈顶元素,此时栈顶元素出栈 当前元素入栈 例如55 13 stack存的是索引 ''' stack = [0] result = 0 for i in range(1,len(height)): # 情况1 栈顶元素大于当前元素,则入栈 if height[i] < height[stack[-1]]: stack.append(i) # 保持单调栈的状态 # 情况2: 当前柱子和栈顶元素一样时,栈顶出栈,当前元素入栈 elif height[i] == height[stack[-1]]: stack.pop() stack.append(i) #情况3: else:# 31 2 31表示栈 2表示当前元素 312 此时就是凹槽 while stack and height[i] > height[stack[-1]]: mid_height = height[stack[-1]] stack.pop() if stack:# 防止 栈中4 当前元素5这种情况 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 stack.append(i) return result