1.14学习博客

今天总结一道栈的中等偏难的题目
柱状图中的最大矩形
在这里插入图片描述
在这里插入图片描述

【算法思路】单调栈
 1.构建单调增栈
 2.数据入栈,如果大于等于栈顶,则直接入栈
 3.如果小于栈顶,则结算栈顶
 4.最终数据的统计,到起始位置,要统计全长度
 (不好理解的话建议将例子代入来理解)
 部分代码如下:
int maxi(int a,int b){
    if(a<b)return b;
    else{return a;}
}
int largestRectangleArea(int* heights, int heightsSize){
    if(heightsSize == 0) {
        return 0;
    }
    //放置数据下标
    int *stk = calloc(heightsSize, sizeof(int));
    int ssize = 0;
    stk[ssize++] = 0;
    int max = 0;
    for(int i = 1; i < heightsSize; i++) {
        int top_h = heights[stk[ssize - 1]];
        if(heights[i] >= top_h) {
            stk[ssize++] = i;
            continue;
        }
        //结算栈顶数据
        while(ssize > 0) {
            top_h = heights[stk[ssize - 1]];
            if(heights[i] >= top_h) {
                break;
            }
            //从栈前一个位置算起
            int width = ssize - 1 == 0? i : i - 1 - stk[ssize - 2];
            max = maxi(max, top_h * width);
            ssize--;
        }
        //将当前数据放入栈顶,目前该数据为栈内最大
        stk[ssize++] = i;
    }
      //结算最后栈内数据
    for(int i = ssize - 1; i >= 0; i--) {
        int top_h = heights[stk[i]];
        int width = i == 0? heightsSize : heightsSize - 1 - stk[i - 1];
        max = maxi(max, top_h * width);
    }
    return max;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值