单调栈
题目
对题目的想法
毫无头绪
实现中/后的感想
- dp解法非常直观,不过思路花了一段时间才理解。矩形的高度就是当前元素的高度,宽度是左右各两边第一个小于当前元素的之间的距离。
- 单调栈方法沿用dp解法的思路,即矩形的高度就是当前元素的高度,宽度是左右各两边第一个小于当前元素的之间的距离。但是比较麻烦的点在于几个极端情况(在提交的时候才发现这几种情况):
- 整个数组都是递增的数列
假如直接复用接雨水的代码,就会发现没有更新的机会。尝试在循环外补充一个此特殊情况的案例(无法通过):
问题在于栈中最小的元素左边第一个比该元素小的元素没有记录,所以无法通过。if (!st.isEmpty()) { int right = st.peek() + 1; while (!st.isEmpty()) { int cur = st.pop(); if (!st.isEmpty()) { int left = st.peek(); res = Math.max(res, h[cur] * (right - left - 1)); } else { res = Math.max(res, h[cur] * (right - cur)); } } }
- 整个数组都是相同的元素
和上面那种情况同样的问题。
- 整个数组都是递增的数列
所以随想录的解决方法是扩充heights
数组,在首尾各添加一个0
,这样两种特殊情况都能在循环内得到解决。