基础
刷题
- 接雨水
三种解法:
双指针解法 及优化:
首先,如果按照列来计算的话,宽度一定是1了,我们再把每一列的雨水的高度求出来就可以了。 按照列来计算,每一列 取决于 左侧最高的柱子和右侧最高的柱子中最矮的那个柱子的高度
每一列的左右侧最高点是固定的,所以可以优化为,先向右遍历,记录右侧最高点,再向左遍历,记录左侧最高点
单调栈解法
需要按照行来计算
将每一个数据对比单调栈的栈顶,单调栈会记录后面第一个比自己大的元素,而如果自己比栈顶小,则入栈,说明栈内从栈底到栈顶是单调递减,单调栈内记录的是比自己大的元素,这样两个比自己大的元素就形成了凹槽,例如图中 数组索引为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()]
- 柱状图中的最大矩形
可以在数组height前后插入0,- 0 <= heights[i] <= 10^4
0就是最小值,属于虚拟头尾节点
总结
接雨水的题目是寻找临近的最高点,柱形图是寻找临近的最低点。都可以用单调栈来处理
接雨水的题目更难,因为对于暴力解法需要找左边最高和右边最高。可以转化为纵向计算雨水面积,使用单调栈来找临近的最高点。