目录
一、前言
单调栈我很久之前就看过了,最近又刷了单调栈经典的两道题目,这篇博客就不说相关理论了,直接看题。
二、仰视奶牛
1、上链接
2、简易思路
单调栈。
3、代码
(1)正向单调栈(未完全AC,9/10)
# 最后一个样例时间超限了, 9/10
N=int(input())
H=[]
for i in range(N):
H.append(int(input()))
stack=[]
for i in range(N):
stack.append(H[i])
top=len(stack)-1
for j in range(i+1,N):
if stack[top]>H[j]:
stack.append(H[j])
elif stack[top]<H[j]:
stack.pop()
top-=1
if top==-1:
print(j+1)
break
while stack[top]<H[j]:
stack.pop()
top-=1
if top==-1:
print(j+1)
if stack.count()==0:
break
if j==N-1:
print(0)
if i==N-1:
print(0)
stack.clear()
(2)逆向单调栈(AC)
# 参考题解思路,自己写逆向单调递减栈
N=int(input())
H=[0]*(N+1)
ans=[0]*(N+1)
stack=[]
for i in range(N):
H[i]=int(input())
for i in range(N-1,-1,-1):
while stack and H[stack[-1]]<=H[i]:
stack.pop()
if not stack:
ans[i]=0
else:
ans[i]=stack[-1]+1
stack.append(i)
for i in range(N):
print(ans[i])
三、直方图最大矩形面积
1、上链接
剑指 Offer II 039. 直方图最大矩形面积 - 力扣(Leetcode)
2、简洁思路
单调栈+首尾常数优化
3、代码
(1)python代码(AC)
class Solution:
def largestRectangleArea(self, heights: list[int]) -> int:
ans=-1
heights=[-1]+heights+[-1]
n=len(heights)
stack=[]
for i in range(n):
if not stack or heights[stack[-1]]<=heights[i]:
stack.append(i)
else:
while heights[stack[-1]]>heights[i]:
h=heights[stack[-1]]
stack.pop()
left=stack[-1]
ans=max(ans,h*(i-left-1))
stack.append(i)
return ans
if __name__=='__main__':
heights=[2,1,5,6,2,3]
# heights=[2,4]
ans=Solution.largestRectangleArea(Solution,heights)
print(ans)
以上,单调栈
祝好