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 =10unit.

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

程序:

方法一:

class Solution {
public:
    int largestRectangleArea(vector<int> &height) {
        if(height.size()==0)
            return 0;
        if(height.size()==1)
            return height[0];
        int len=height.size();
        vector<int> dp(len,0);
        for(int i=0;i<len;i++)
        {
            if(i==0)
            {
                int j=i;
                int count=0;
                while(j<len&&height[i]<=height[j])
                {
                    count++;
                    j++;
                }
                dp[i]=count*height[i];

            }
            else if(i==len-1)
            {
                int j=i;
                int count=0;
                while(j>=0&&height[i]<=height[j])
                {
                    count++;
                    j--;
                }
                dp[i]=count*height[i];
            }
            else
            {
                int j=i;
                int count=0;
                while(j<len&&height[i]<=height[j])
                {
                    count++;
                    j++;
                }
                j=i;
                while(j>=0&&height[i]<=height[j])
                {
                    count++;
                    j--;
                }

                dp[i]=(count-1)*height[i];
            }
        }

        int res=0;
        for(int i=0;i<dp.size();i++)
            if(dp[i]>res)
                res=dp[i];
        return res;

    }
};

方法二:

使用堆栈 O(n)

/*
用堆栈计算每一块板能延伸到的左右边界
对每一块板
 堆栈顶矮,这一块左边界确定,入栈
 堆栈顶高,堆栈顶右边界确定,出栈,计算面积
 入栈时左边界确定
 出栈时右边界确定
 堆栈里元素是递增的
本质:中间的短板没有用!
复杂度 O(n)
*/
class Solution {
public:
    int largestRectangleArea(vector<int> &height) {
        int n=height.size(),result=0;
        stack<int> s;
        for(int i=0;i<n;++i){
            while((!s.empty())&&(height[s.top()]>=height[i])){
                int h=height[s.top()];
                s.pop();
                result=max(result,(i-1-(s.empty()?(-1):s.top()))*h);
            }
            s.push(i);
        }
        while(!s.empty()){
            int h=height[s.top()];
            s.pop();
            result=max(result,(n-1-(s.empty()?(-1):s.top()))*h);
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值