#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param nums int整型一维数组
# @return int整型二维数组
#
class Solution:
def foundMonotoneStack(self , nums: List[int]) -> List[List[int]]:
# 1、单调栈:从左到右遍历找l,从右到左遍历找r,
n=len(nums)
stack=[]
res=[]
lres=[0]*n
rres=[0]*n
for i in range(n):
while stack and nums[stack[-1]] >= nums[i]:
#若栈顶元素比nums[i]大,淘汰栈顶元素
#i左边解都找到了,则i和i右侧的都不可能是这些更大的元素
#一直弹栈,直到栈顶元素小于nums[i]
stack.pop()
#若栈空了,说明i左边都比nums[i]大,无解,否则,栈顶就是答案
lres[i]=stack[-1] if stack else -1
#i入栈,因为i可能成为i右边的答案
stack.append(i)
#清空栈
stack=[]
#从右往左遍历,同逻辑
for i in range(n-1,-1,-1):
while stack and nums[stack[-1]] >= nums[i]:
stack.pop()
rres[i]=stack[-1] if stack else -1
#i入栈,因为i可能成为i左边的答案
stack.append(i)
#合并l和r的结果
for i in range(n):
res.append([lres[i],rres[i]])
return res
#2、暴力破解,超时
# n=len(nums)
# res=[]
# for i in range(0, n):
# l=-1
# r=-1
# #从左往右找l,比nums[i]小的最近的nums[l]
# for j in range(0, i):
# if nums[j] < nums[i]:
# l=j
# #从右往左找r,比nums[i]小的最近的nums[r]
# for j in range(n-1,i,-1):
# if nums[j] < nums[i]:
# r=j
# res.append([l,r])
# return res