单调栈:用于求解一个序列中 每个元素 左边或右边第一个比其小的元素。
对应例题 : 百亿富翁
# 查找 「比当前元素大的元素」 就用 单调递增栈,查找「比当前元素小的元素」就用 单调递减栈。
# 从 「左侧」 查找就看 「插入栈」 时的栈顶元素,从 「右侧」 查找就看 「弹出栈」 时即将插入的元素
N = int(input())
building = list(map(int,input().split()))
def nextGreaterElement(nums) : # 寻找右边比这个元素大的元素
res = []
stack = []
length = len(nums)
for i in range(length-1,-1,-1) : # 倒序
while stack and stack[-1] < nums[i] : # 将栈顶比当前元素小的元素全部pop出栈
stack.pop()
if len(stack) == 0 : # 若栈空了,则不存在满足的元素
cur = -1
else :
cur = nums.index(stack[-1]) + 1 # 否则,找到比当前元素大的元素 即为当前的栈顶
res.append(cur) # 将结果放入结果数组
stack.append(nums[i]) # 将当前元素放入栈
res.reverse()
return res
def beforeGreaterelement(nums) : # 寻找左边比这个元素大的元素 (原理与上相同)
res = []
stack = []
length = len(nums)
for i in range(length) :
while stack and stack[-1] < nums[i] :
stack.pop()
if len(stack) == 0 :
cur = -1
else :
cur = nums.index(stack[-1]) + 1
res.append(cur)
stack.append(nums[i])
return res
print(beforeGreaterelement(building))
print(nextGreaterElement(building))