单调栈1 — 直方图最大面积

直方图最大面积


时间限制:1 sec

空间限制:256 MB

问题描述

有一个直方图,横轴长度为 n,第 i 列的高度为 h[i]。

请你求出在这个直方图中面积最大的子矩阵。

输入格式

第一行一个正整数 n。

第二行 n 个用空格隔开的非负整数,依次描述 h[1],h[2],…,h[n]。

输出格式

输出一行一个数,表示最大面积。

样例输入

5
2 3 3 3 2

样例输出

10

数据范围

对于 30% 的测试点,保证 n<=4。

对于 70% 的测试点,保证 n<=1000。

对于所有测试点,保证 n<=50000。

保证所有 h[i] 不超过 32767。


#include 
#include 
#include 
using namespace std;
    // n:意义如题
    // height:高度数组,height[i]表示第i列的高度(下标从1开始),数组大小为n+2,其中height[0]和height[n+1]都为0
    // 返回值:题目所求答案,即最大面积
int getAnswer(int n, int *height) {
    int ans = 0;
    stack< int > myStack;
    /* push(0) 是为了能把第一个元素入栈 */
    myStack.push(0);
    /* 从N+1开始是为了把最后一个元素和第一个元素也弹出来 */
    for(int i = 1; i <= n+1; ++i){
        while ((height[myStack.top()] > height[i])) {
            int nowHeight = height[myStack.top()];
            myStack.pop();
            ans = max(ans, nowHeight * (i - myStack.top() - 1));
            /* 其实蛮不容易的QAQ,我这一句一直写错,后来重新看了一遍视频才写出来- - */
        }
        myStack.push(i);
    }
    return ans;
    /* 请在这里设计你的算法,并将答案返回 */
}

int main() {
    int n;
    cin >> n;
    
    int* height = new int[n + 2]();
    
    for(int i = 0; i < n+2; i++)  /*初始化,虽然不太有必要*/
        height[i] = 0;
    
    for (int i = 1; i <= n; ++i)
        cin >> height[i];
    
    cout << getAnswer(n, height) << endl;
    
    delete[] height;
    return 0;
}

你可能感兴趣的:(leetcode)