leetcode 84.Largest Rectangle in Histogram

这道题是在一堆高度不同的矩阵直方图中寻找到面积最大的矩阵,那么可以考虑的就是找出序列中高度的局部最大值,然后往左边来寻找可能的面积最大值的。

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

还有另外一种做法就是维护一个单调栈的,用于保存一个递增序列类似于上述的寻找局部的峰值的,如果要使得面积最大的话就需要使得连续的矩形的高度更高的,由最低的高度来决定的。

维护一个递增栈,当遇到数字大的时候就进栈了,遇到小于的时候就开始对栈顶元素进行处理的。为了使得最后一个高度也能够被利用到就需要在最后的高度上加上0的。

当栈中的元素为空的时候就说明当前弹出的是目前所有的最小值的,因为始终保持的是栈中的元素都是更小的,并且最后还需要对当前的循环变量进行处理的。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        heights.push_back(0); // 使得最后的一个高度也能够被计算
        stack<int> st;
        int n=heights.size(), res=0;
        for(int i=0;i<n;i++){
            if(st.empty() || heights[st.top()]<heights[i]){
                st.push(i);
                
            }else{
                int temp=st.top(); st.pop();
                // 这里不能使用i-temp作为长度的,样例如1,2,2或者1,3,2的,因为之前被弹出之后仍旧满足大于的条件可以被接着使用的。始终记住一点就是栈中余下的数都是一定比所弹出的数字要小的,
                res=max(res, (st.empty())?heights[temp]*i:heights[temp]*(i-st.top()-1));

                i--; // 使得当前i的能被重新考虑是否入栈的
            }
        }
        return res;
    }
};    

 

posted on 2018-09-12 15:10  昔风不止,唯有努力生存  阅读(102)  评论(0编辑  收藏  举报

导航