【LeetCode 84】Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务

85 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情

一、题目描述

给定一个柱状图,用n个数字表示,每个柱子宽度为1,求图中最大的矩形面积。

数据范围

n <= 100000, h[i] <= 10000

二、思路分析

朴素想法: 暴力二重循环,但是这样子复杂度太高了,浪费复杂度的地方在于对于每个柱子,找它的最左最右的柱子要花很多时间。

不朴素想法: 采用单调栈的做法,维护一个单调递增的栈,当某个柱子要出栈的时候,它一定是遇到了它右边第一个比它小的柱子(把它卡住了),同时因为单调栈的性质,它自身前一个元素就是它左边第一个比它小的柱子(比它高的被它自己给出栈出光了)。所以每当一个柱子出栈的时候,就能够计算以它为矩形“中心”的最大面积了。

三、AC代码

class Solution {
public:
    int l,r,ans=0;
    vector<int > f;

    int largestRectangleArea(vector<int>& heights){
        heights.push_back(0);
        int n = heights.size();
        for (int i = 0; i < n; i++) {
            while (!f.empty() && heights[f.back()] > heights[i]) {
                int now = f.back();
                f.pop_back();

                if (f.empty()) l=0;
                            else l = f.back() + 1;
                r = i - 1;
                ans = max(ans, (r-l+1) * heights[now]);
            }
            f.push_back(i);
        }
        return ans;
    }
};

四、总结

注意观察题目,利用单调栈的性质去维护柱子,避免了重复计算。