Skip to content

84. Largest Rectangle in Histogram

难度:Hard

刷题内容

原题连接

  • https://leetcode.com/problems/largest-rectangle-in-histogram/

内容描述

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.

Example:

Input: [2,1,5,6,2,3]
Output: 10

思路1 **- 时间复杂度: O(n^2)*- 空间复杂度: O(n)***

这题第一种思路就是用暴力的方法去解。时间复杂度为O(n^2)。遍历数组,对数组中每个元素分别向右向左找到最远,计算最大值得到结果

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        long long ans = 0;
        for(int i = 0;i < heights.size();++i)
        {
            int j = i + 1;
            long long l,r;
            for(;j < heights.size();++j)
                if(heights[j] < heights[i])
                {
                    r = (long long)heights[i] * (j - i);
                    break;
                }
            if(j == heights.size())
                r = (long long)heights[i] * (heights.size() - i);
            for(j = i - 1;j >= 0;--j)
                if(heights[j] < heights[i])
                {
                    l = (long long)heights[i] * (i - j - 1);
                    break;
                }
            if(j < 0)
                l = (long long)heights[i] * i;
            ans = max(ans,l + r);
        }
        return ans;
    }
};

思路2 **- 时间复杂度: O(n)*- 空间复杂度: O(n)***

上面第一种方法的实现中有重复计算的过程,我们用栈去解决这个问题就很好的剔除了重复计算的过程,时间复杂度降到了O(n)。先定义一个栈,我们要保证栈中的数是递增的,遍历数组,若这个数小于栈顶的数,则将栈顶的数弹出,并计算栈顶元素的最大距离,直到栈为空或者比这个数小

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        long long ans = 0;
        heights.push_back(0);
        vector<pair<long long,int> > v;
        for(int i = 0;i < heights.size();++i)
        {
            if(!v.size() || heights[i] > v[v.size() - 1].first)
                    v.push_back(make_pair(heights[i],i));
            else
            {
                int j = v.size() - 1;
                while(j > 0 && v[j].first > heights[i])
                {
                    ans = max(ans,v[j].first * (i - v[j - 1].second - 1));
                    v.pop_back();
                    --j;
                }
                if(!j && v[j].first > heights[i])
                {
                    ans = max(ans,v[j].first * (i));
                    v.pop_back();
                }
                v.push_back(make_pair(heights[i],i));
            }
        }
        return ans;
    }
};

我们一直在努力

apachecn/AiLearning

【布客】中文翻译组