Day49 - 单调栈 Part02

76 阅读2分钟

基础

刷题

  1. 接雨水

leetcode.cn/problems/tr…

image.png

三种解法:

双指针解法 及优化:

首先,如果按照列来计算的话,宽度一定是1了,我们再把每一列的雨水的高度求出来就可以了。 按照列来计算,每一列 取决于 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度

每一列的左右侧最高点是固定的,所以可以优化为,先向右遍历,记录右侧最高点,再向左遍历,记录左侧最高点

image.png

单调栈解法

需要按照行来计算

image.png

将每一个数据对比单调栈的栈顶,单调栈会记录后面第一个比自己大的元素,而如果自己比栈顶小,则入栈,说明栈内从栈底到栈顶是单调递减,单调栈内记录的是比自己大的元素,这样两个比自己大的元素就形成了凹槽,例如图中 数组索引为4,5,6 的元素,, 取左右最大值中的最小值,填平凹槽,删除stack中的height[5]. stack中的新栈顶height[4] 和 height[6]开始比较。

这里比较只有三种情况:

  • 情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()]
  • 情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()]
  • 情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()]
  1. 柱状图中的最大矩形

leetcode.cn/problems/la…

image.png

image.png

可以在数组height前后插入0,- 0 <= heights[i] <= 10^4

0就是最小值,属于虚拟头尾节点

image.png

总结

接雨水的题目是寻找临近的最高点,柱形图是寻找临近的最低点。都可以用单调栈来处理

接雨水的题目更难,因为对于暴力解法需要找左边最高和右边最高。可以转化为纵向计算雨水面积,使用单调栈来找临近的最高点。