503.下一个更大元素II
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
dp = [-1] * len(nums)
stack = []
for i in range(len(nums)*2):
while(len(stack) != 0 and nums[i%len(nums)] > nums[stack[-1]]):
dp[stack[-1]] = nums[i%len(nums)]
stack.pop()
stack.append(i%len(nums))
return dp
42. 接雨水
思路:
- 遍历高度数组
height
。 - 如果当前柱体高度较小,小于等于栈顶柱体的高度,则将当前柱子高度入栈。
- 如果当前柱体高度较大,大于栈顶柱体的高度,则一直出栈,直到当前柱体小于等于栈顶柱体的高度。
- 假设当前柱体为C,出栈柱体为B,出栈之后新的栈顶柱体为A。则说明:
- 当前柱体
C
是出栈柱体B
向右找到的第一个大于当前柱体高度的柱体,那么以出栈柱体B
为中心,可以向右将宽度扩展到当前柱体C
。 - 新的栈顶柱体
A
是出栈柱体B
向左找到的第一个大于当前柱体高度的柱体,那么以出栈柱体B
为中心,可以向左将宽度扩展到当前柱体A
。
- 当前柱体
- 出栈后,以新的栈顶柱体
A
为左边界,以当前柱体C
为右边界,以左右边界与出栈柱体B
的高度差为深度,计算可以接到雨水的面积。然后记录并更新累积面积。
class Solution:
def trap(self, height: List[int]) -> int:
ans = 0
stack = []
size = len(height)
for i in range(size):
while stack and height[i] > height[stack[-1]]:
cur = stack.pop(-1)
if stack:
left = stack[-1] + 1
right = i - 1
high = min(height[i], height[stack[-1]]) - height[cur]
ans += high * (right - left + 1)
else:
break
stack.append(i)
return ans