leetcode84——柱状图的最大矩形

Posted dtwd886

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode84——柱状图的最大矩形相关的知识,希望对你有一定的参考价值。

单调栈的方法,每次弹出大于等于当前需要入栈的元素,且最后的栈是顺序递增的,需要将所有元素依次弹出,这个时候每个弹出的元素所对应的最大面积为index=stk.top(),stk.pop(),result_max=max(result_max,(len-stk.top()-1)*heights[index])

class Solution 
public:
    int largestRectangleArea(vector<int>& heights) 
        int len=heights.size();
        stack<int>stk;
        stk.push(-1);
        int max_result=0;
        for(int i=0;i<len;i++)
        
            if(stk.top()==-1||heights[stk.top()]<heights[i])
            
                stk.push(i);
               
            else
            
                
                while(stk.top()!=-1&&heights[stk.top()]>=heights[i])
                
                    int index=stk.top();
                    cout<<index<<" "<<endl;
                    stk.pop();
                    max_result=max(max_result,(i-stk.top()-1)*heights[index]);
                
                stk.push(i);
             
        
        cout<<stk.size()<<endl;
        int index_temp=stk.top();
        while(stk.top()!=-1)
        
            int index=stk.top();
            stk.pop();
            //cout<<index<<" "<<index_temp<<" "<<stk.top()<<endl;
            max_result=max(max_result,(len-stk.top()-1)*heights[index]);
            //index_temp=index;
        
        return max_result;
    
;

 

方法二:记录左右边界的方法

class Solution 
public:
    int largestRectangleArea(vector<int>& heights) 
        int len=heights.size();
        int max_result=0;
        vector<int>left;
        vector<int>right(len,0);
        stack<int>stk1;
        stack<int>stk2;
        stk1.push(-1);
        stk2.push(len);
        for(int i=0;i<len;i++)
        
            while(stk1.top()!=-1&&heights[stk1.top()]>=heights[i])
            
                stk1.pop();
            
                left.push_back(stk1.top());
                stk1.push(i);
        
         for(int i=len-1;i>=0;i--)
        
            while(stk2.top()!=len&&heights[stk2.top()]>=heights[i])
            
                stk2.pop();
            
                cout<<stk2.top()<<endl;
                right[i]=stk2.top();
                stk2.push(i);
        
        for(int i=0;i<len;i++)
        
            //cout<<left[i]<<" "<<right[i]<<endl;
            max_result=max(max_result,(right[i]-left[i]-1)*heights[i]);
        
        return max_result;
    
;

方法二的优化:一遍遍历

class Solution 
public:
    int largestRectangleArea(vector<int>& heights) 
        int len=heights.size();
        int max_result=0;
        vector<int>left;
        vector<int>right(len,len);
        stack<int>stk1;
        stack<int>stk2;
        stk1.push(-1);
        stk2.push(len);
        for(int i=0;i<len;i++)
        
            while(stk1.top()!=-1&&heights[stk1.top()]>=heights[i])
            
                right[stk1.top()]=i;
                stk1.pop();
            
            left.push_back(stk1.top());
            stk1.push(i);
        
         for(int i=len-1;i>=0;i--)
        
            while(stk2.top()!=len&&heights[stk2.top()]>=heights[i])
            
                stk2.pop();
            
                cout<<stk2.top()<<endl;
                right[i]=stk2.top();
                stk2.push(i);
        
        for(int i=0;i<len;i++)
        
            //cout<<left[i]<<" "<<right[i]<<endl;
            max_result=max(max_result,(right[i]-left[i]-1)*heights[i]);
        
        return max_result;
    
;

 

以上是关于leetcode84——柱状图的最大矩形的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 84. 柱状图中最大的矩形 | Python

LeetCode 84. 柱状图中最大的矩形 | Python

[LeetCode] 84. 柱状图中最大的矩形

LeetCode84:柱状图中最大的矩形

LeetCode(84): 柱状图中最大的矩形

84.柱状图中最大的矩形