30 Day Challenge Day 22 | Leetcode 84. Largest Rectangle in Histogram

题解

Hard

方法一:Better Brute Force

思路是好理解的:从左往右遍历,在每一个位置,又从当前位置遍历到数组最后,同时更新 minheight * current_width .

这个方法还不足以通过,但是对后面的85题有启发意义。所以放在这里。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int maxarea = 0;
        for (int i = 0; i < heights.size(); i++) {
            int minheight = INT_MAX;
            for (int j = i; j < heights.size(); j++) {
                minheight = min(minheight, heights[j]);
                maxarea = max(maxarea, minheight * (j - i + 1));
            }
        }
        return maxarea;
    }
};

方法二:栈(Stack)

从左往右遍历,如果当前的值更大,压入栈中,直到遇到一个较小的值,那么此时栈顶就是一个极大值,有可能找到最大的面积。

进入循环,把大于当前位置值的栈内元素都退出。同时更新宽度,更新面积值。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int ret = 0;
        heights.push_back(0);
        vector<int> index;
        
        for(int i = 0; i < heights.size(); i++) {
            while(index.size() > 0 && heights[index.back()] >= heights[i]) {
                int h = heights[index.back()];
                index.pop_back();
                
                int sidx = index.size() > 0 ? index.back() : -1;
                if(h * (i-sidx-1) > ret)
                    ret = h * (i-sidx-1);
            }
            index.push_back(i);
        }
        
        return ret;        
    }
};
原文地址:https://www.cnblogs.com/casperwin/p/13789889.html