直方图中最大矩形面积

51nod1102 面积最大的矩形

题面:给定一个直方图,在图中找出一个矩形,使其面积最大,求最大的面积。

分析:这是道比较有趣的面试题,朴素做法是枚举每个点,以其高度作为矩形的高度,并尽可能地往左右两端延伸,得到最大面积,时间复杂度为O(n^2),效率不够。网上有通过单调栈的O(n)做法,但不太容易理解。下面这种做法是在朴素做法的基础上优化,先预处理出每个高度能到达的最左最右边界,然后扫一遍得到最优解,总时间复杂度也为O(n),而单调栈的做法其实是对该做法的再次优化,减少遍历次数。

记h[x]表示坐标为x处的高度,l[x]表示x能往左延伸的最小值,但不包含在内,即h[l[x]] < h[x],同理,r[x]表示x能往右延伸的最大值,那么在预处理时可用dp的思想跳跃式进行。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int n, h[50005], l[50005], r[50005];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> h[i];
    l[1] = 0;
    for (int i = 2; i <= n; i++) {
        int j = i-1;
        while (h[j] >= h[i])
            j = l[j];
        l[i] = j;
    }
    r[n] = n+1;
    for (int i = n-1; i >= 1; i--) {
        int j = i+1;
        while (h[j] >= h[i])
            j = r[j];
        r[i] = j;
    }
    LL ans = 0;
    for (int i = 1; i <= n; i++)
        ans = max(ans, (LL)h[i] * (r[i]-l[i]-1));
    cout << ans << endl;
    return 0;
}
Table of Contents