● 503.下一个更大元素II
● 42. 接雨水
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
此处为循环数组,在 #496 下一个更大元素 I 的思路上,通过增加遍历次数(多遍历一次数组)达到最小循环数组目的
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
n = len(nums)
answer = [-1] * n
stack = []
for i in range(2 * n):
while stack and nums[i % n] > nums[stack[-1]]:
answer[stack.pop()] = nums[i % n]
stack.append(i % n)
return answer
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
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: #确保stack不为空
L_height = height[stack[-1]]
R_height = height[i]
H = min(L_height, R_height) - mid_height
W = i - stack[-1] - 1
result += H * W
stack.append(i)
return result