LC的课后辅导 QDU

点击打开链接

此题暴力可过(O(n^2)) 亦可用栈优化(O(n)) 即通过栈保存矩形编号 找出每个矩形左右可到达的最远边界

例如从左至右遍历 遍历至哪个矩形 该矩形的左边界即可得

假设遍历至h[i]矩形 若栈顶元素stack[top]==p即为h[p]矩形的编号

若h[p]大于h[i] 则弹出栈顶元素而看栈中下一个元素 直至某个矩形h[q]小于h[i] 则确定为h[i]矩形的边界(具体原因要思考)

 

#include <stdio.h>

int main()
{
    int h[101],ans1[101],ans2[101],stack[101];
    int n,i,top,sum,max;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        for(i=1;i<=n;i++)
        {
            scanf("%d",h+i);
        }
        top=0;
        for(i=1;i<=n;i++)
        {
            while(top!=0&&h[stack[top]]>=h[i]) top--;
            if(top==0)
            {
                ans1[i]=1;
            }
            else
            {
                ans1[i]=stack[top]+1;
            }
            top++;
            stack[top]=i;
        }

        top=0;
        for(i=n;i>=1;i--)
        {
            while(top!=0&&h[stack[top]]>=h[i]) top--;
            if(top==0)
            {
                ans2[i]=n;
            }
            else
            {
                ans2[i]=stack[top]-1;
            }
            top++;
            stack[top]=i;
        }

        max=0;
        for(i=1;i<=n;i++)
        {
            sum=h[i]*(ans2[i]-ans1[i]+1);
            if(sum>max) max=sum;
        }
        printf("%d\n",max);
    }
    return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值