算法训练——单调栈专题

单调栈题目

遇到的问题,和前后元素之间的大小关系有关系的话,可以考虑单调栈。
做题时,思考单增还是单减。处理边界:栈底是否需要占位,栈顶是否额外入一个值。入栈为索引还是数值。

栈问题,实现计算器8,字符串中是由数字和符号组成的,数字是0到INT_MAX。我在分数字的时候,采用val=val*10+s[i]-‘0’,就会出现溢出,如果测试数据得值本身就是INT_MAX,那我式子中的加号会导致溢出,所以把s[i]-'0’括号起来,就会避免溢出。

739,每日温度

返回数组answer,对于第i天,下一个更高温度出现在几天后,如果没有更高的,用0代表。
解析:使用非单增栈,索引入栈。对于每个即将入栈的值,先比较栈顶的索引对应的温度是否满足≥该值,如果满足,直接入栈,否则就要弹栈,并且对于每个弹出的元素a,这个即将入栈的元素都是a的下一个更高的温度,即answer[a]=即将入栈的值。

84 柱状图中最大矩形

使用单增栈,考虑边界问题:height尾部添加一个0。索引入栈。每个元素出栈的时候要计算出对应的答案。
易错点:为什么求解宽度计算i-sidx-1呢? 这个sidx是当前出栈柱状的左边一个柱状的索引。为什么不能直接用 i-当前出栈柱状的索引 呢?
答:如果当前出栈元素是栈内唯一一个柱状,那么显然上一个已经出栈的柱状的高度是大于当前要出栈的柱状的。换句话说,当前出栈柱状的宽度是可以向左扩展一个宽度的。如果这句话不理解,请尝试使用[2,1,0]这个测试用例,柱状h[0]=2入栈,柱状h[1]=1要入栈时,h[0]需要出栈。柱状h[2]=0入栈时,h[1]=1需要出栈,此时计算它的宽度,如果wei= i- 1=1,那么以h[1]=1为柱状高度的宽度为1,但是者显然错误,因为第一次出栈的h[0]=2比h[1]高,所以h[1]是可以向h[0]扩展的。
在这里插入图片描述

85最大矩形

和上面那道题解法一致,但是不同的是,上面那道题只需要执行一遍单调栈算法,这里需要以每一行作为底部水平线,以当前底线为柱状底部,计算该柱状有多少个连续1,之后进行单调栈算法。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值