ubuntu 做网站 分区沈阳关键词优化费用
42. 接雨水
关键点有以下几个
首先是怎么去理解接雨水 其实就是找每一个段的左边第一个最大值和右边第一个最大值
既然是最大值 那么单调栈就是递增的
左边第一个最大值其实就是pop掉中间的之后st.top
由于是出现大于等于情况时候进行操作 所以右边最大值就是i
接下来就是在大于的情况进行操作
由于这种题目需要先去pop得到中间值 所以说后续需要再进行一次empty判断
雨水体积是高 x 宽
高度就由两边高度更低的决定
宽度就以两边index -1决定
当while loop结束之后 说明栈中没有元素了或者说当前这个元素要小于栈中的元素了
那么就把这个元素放进来
84. 柱状图中最大的矩形
这道题整体思路和接雨水很像 但是也有一些区别
首先就是怎么找最大的矩形
其实就是找一个位置左边的最小值和右边的最小值
左边的最小值是向左延伸到哪 右边就对应了向右延伸到哪
为了避免原本的height数组就是单调递增或递减的 所以要在前后加上一个0
末尾为什么要加元素0?
如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了
开头为什么要加元素0
如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),right(6),但是得不到 left。
(mid、left,right 都是对应版本一里的逻辑)
因为 将 8 弹出之后,栈里没有元素了,那么为了避免空栈取值,直接跳过了计算结果的逻辑。
之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 6 进行比较,周而复始,那么计算的最后结果result就是0。
之后的逻辑就是一样的了