直方图中的最大矩形

Posted hhyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了直方图中的最大矩形相关的知识,希望对你有一定的参考价值。

# 题意

直方图是在公共基线处对齐的一系列矩形组成的多边形,各矩形具有相同的宽度,但可以有不同的高度,求最大矩形的面积
例如

技术图片

阴影部分即最大面积

# 题解
建立一个递增单调栈,保存高度
1) 当前矩形的高度比栈顶矩形高,直接进栈
2) 当前小于栈顶就不断去除,累计所有取出的矩形的宽度之和,并且每弹出一个矩形,就用他的高度呈上累计的宽度更新答案,过程结束后再将当前矩形入栈,增加一个高度为0的矩形,避免栈中有剩余矩形

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 const int N = 1e5+10;
 5 int n;
 6 int a[N],stk[N];
 7 int wid[N];
 8 void work(){
 9    memset(stk,0,sizeof stk);
10    for(int i = 1; i <= n; i++)
11       cin >> a[i];
12    a[n+1] = 0;
13    int idx = 0;
14    ll ans = 0;
15    for(int i = 1; i <= n + 1; i++){
16       if(a[i] > stk[idx]){
17          stk[++idx] = a[i];
18          wid[idx] = 1;
19       }
20       else{
21          int width=0;
22          while(stk[idx] > a[i]){
23             width += wid[idx];
24             ans=max(ans,(ll)stk[idx]*width);
25             idx--;
26          }
27          stk[++idx] = a[i];
28          wid[idx] = width + 1;
29       }
30    }
31    cout << ans << endl;
32 }
33 int main(){
34    ios::sync_with_stdio(0);
35    cin.tie(0);
36    cout.tie(0);
37    while(cin >> n && n){
38       work();
39    }
40 }

 

以上是关于直方图中的最大矩形的主要内容,如果未能解决你的问题,请参考以下文章

算法学习——剑指 Offer II 039. 直方图最大矩形面积(Java实现蛮力,分治,单调栈)

算法学习——剑指 Offer II 039. 直方图最大矩形面积(Java实现蛮力,分治,单调栈)

[leetcode] 85. 最大矩形

算法: 直方图中的最大矩形84. Largest Rectangle in Histogram

直方图中最大矩形面积

Leetcode 84 求直方图中矩形的最大面积