class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
dp=[-1]*len(nums)
stack=[0]
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
class Solution:
def trap(self, height: List[int]) -> int:
stack = [0]
result = 0
for i in range(1, len(height)):
# 情况一
if height[i] < height[stack[-1]]:
stack.append(i)
# 情况二
# 当当前柱子高度和栈顶一致时,左边的一个是不可能存放雨水的,所以保留右侧新柱子
# 需要使用最右边的柱子来计算宽度
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_number=height[i]
left_number=height[stack[-1]]
h=min(right_number,left_number)-mid_height
w=i-stack[-1]-1
result+=h*w
stack.append(i)
return result