栈与单调栈
栈
维护一种完全包含关系的结构;栈就是一种后进先出的结构。栈和队列一样,都是计算机中,用来规范处理顺序的基础结构。
单调栈
维护最近大于或小于关系的结构;单调栈就是堵住出口的单调队列,所以其时间复杂度与单调队列一致,平均到每个处理元素上,都是 O(1) 的时间复杂度。
最大矩形面积(通过单调栈,时间复杂度可以从O(n^2) 到O(n))
int max_matrix_area(int *h, int n) {
h[0]=h[n+1]=-1;
top=0, s[top]=0;
// 每条木板,都找到左边最近短于自己的木板下标
for(int i =1; i<=n; i++) {
while(top >=0 && h[s[top]] >= h[i]) --top;
l[i]=s[top];
s[++top] = i;
}
// 每条木板,都找到右边最近短于自己的木板下标
top=0, s[top]=n+1;
for(int i =n; i>=1; i--) {
while(top >=0 && h[s[top]] >= h[i]) --top;
r[i]=s[top];
s[++top] = i;
}
// 所有木板中,找到最大的矩形
ans=0;
for(int i=1; i<=n; i++) {
ans=max(ans, (r[i]-l[i]-1)*h[i]);
}
return ans;
}
参考文献
- 此文章为2月Day2学习笔记,内容来源于极客时间《人人都能学会的编程入门课》
最后
文中若有我没说清楚或错误的地方
欢迎v我yxdiet,备注下是掘金的小伙伴!
反手赞一个叭!对我是莫大的鼓励 💗