Largest Rectangle in a Histogram-单调栈

单调栈练习:

总结一些单调栈做这一类题的性质:

  1. 什么是单调栈

单调栈就是保持了单调性和栈的性质;

单调递增的栈就是从栈尾到栈顶是单调递增的;

  1. 单调栈能够解决的问题

1) 以自己为最小或最大值找到最大的区间,(对应 单调递增/单调递减);

2) 给定一个区间,找到这个区间的最大或最小值;

  1. 单调栈的性质

1) 对于第一个出栈元素,它的右宽一定为0;

2) 对于第二个出栈元素,它的右宽为前一个出栈元素的总宽;

3) 对于第三个出栈元素,它的右宽为第二个出栈元素的总宽;

   …………

4) 好了,终于遇到了比自己小的元素可以入栈了,那么入栈元素的左宽为上次出栈元素的总宽+1(自身);(若无出栈元素,则左宽为1(自身)

5) 最后将栈中所有元素出栈考虑所有情况;

对于本题来说,第一次入栈的左宽一定是1。第一个出栈的有宽度一定是0,对于后一个出栈的右宽一定是上一个出栈的总宽。出栈完再入栈的那个元素的左宽肯定为上一个出栈元素的总宽。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

#include <iostream>
#include <set>
#include <algorithm> 大专栏  Largest Rectangle in a Histogram-单调栈;
#include <string.h>
#include<queue>
#include<stack>

using namespace std;
const int N = 1e7 + 5;
int w[N];
int st[N]={-1};
long long top;
int ()
{
int n;
while(cin>>n,n)
{
int temp;
long long ans = 0;
top = 0;
for (int i = 1; i <= n+1;i++)
{
if(i!=n+1)
cin >> temp;
else temp=0;
if(st[top]<temp)
{
st[++top] = temp;
w[top] = 1;
}
else
{
long long cnt = 0;
while(top>0&&st[top]>=temp)
{
ans = max(ans, (w[top] + cnt) * st[top]);
cnt = cnt+ w[top--];
}
st[++top]=temp;
w[top] = cnt + 1;
}
}
cout << ans << endl;
}
}
上一篇:JS 函数防抖和节流


下一篇:vue 应用-防抖