leetcode[84]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.

 

For example,
Given height = [2,1,5,6,2,3],
return 10.

class Solution {

public:

/*

    int Max(int a, int b){return a > b ? a : b;}  

    int largestRectangleArea(vector<int> &height) {  

        height.push_back(0);  

        stack<int> stk;  

        int i = 0;  

        int maxArea = 0;  

        while(i < height.size()){  

            if(stk.empty() || height[stk.top()] <= height[i]){  

                stk.push(i++);  

            }else {  

                int t = stk.top();  

                stk.pop();  

                maxArea = Max(maxArea, height[t] * (stk.empty() ? i : i - t));  

            }  

        }  

        return maxArea;  

    }



int largestRectangleArea(vector<int> &height) 

{

    if(height.empty())return 0;

    height.push_back(0);

    int maxRes=0;

    stack<int> sta;

    for (int i=0;i<height.size();i++)

    {

        if (sta.empty()||(!sta.empty()&&height[i]>=height[sta.top()]))

        {

            sta.push(i);

        }

        else

        {

            int top;

            int newRes;

            while(!sta.empty()&&height[i]<height[sta.top()])

            {

                top=sta.top();

                sta.pop();

                newRes=(sta.empty()?i:(i-sta.top()-1))*height[top];

                maxRes=maxRes>newRes?maxRes:newRes;

                

            }

            sta.push(i);

        }

    }

    return maxRes;

}

*/

int largestRectangleArea(vector<int> &height) 

{

    if(height.empty())return 0;

    height.push_back(0);

    int maxRes=0;

    stack<int> sta;

    for (int i=0;i<height.size();i++)

    {

        int top;

        int newRes;

        while(!sta.empty()&&height[i]<height[sta.top()])

        {

            top=sta.top();

            sta.pop();

            newRes=(sta.empty()?i:(i-sta.top()-1))*height[top];

            maxRes=maxRes>newRes?maxRes:newRes;                

        }

        sta.push(i);

    }

    return maxRes;

}

};

 

你可能感兴趣的:(LeetCode)