循环数组就是模拟的跑两遍
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
dp=[-1]*len(nums)
stack=[]
for i in range(len(nums)*2):
while stack 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:
lefts,rights=[0]*len(height),[0]*len(height)
lefts[0]=height[0]
for i in range(1,len(height)):
lefts[i]=max(lefts[i-1],height[i])
rights[-1]=height[-1]
for i in range(len(height)-2,-1,-1):
rights[i]=max(rights[i+1],height[i])
res=0
for i in range(len(height)):
summ=min(lefts[i],rights[i])-height[i]
res+=summ
return res
单调栈版
单调栈是按行的思路 出现凹槽就记 算h*w的方块
class Solution:
def trap(self, height: List[int]) -> int:
stack=[0]
res=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[stack[-1]]
stack.pop()
if stack:
right=height[i]
left=height[stack[-1]]
h=min(right,left)-mid
w=i-stack[-1]-1
res+=h*w
stack.append(i)
return res