42. 接雨水
思路(按行计算和按列计算)
双指针思路(按列计算):求左边最高高度和右边最高高度,即可知道当前位置会蓄多少水。
左边最高高度可以由前一个数的左边最高高度求得
右边最高高度可以由后一个数的右边最高高度求得
left[i]=Math.max(left[i-1],height[i-1]);
right[i]=Math.max(right[i+1],height[i+1]);
单调栈思路(按行计算):求左边第一个比自己高的元素和右边第一个比自己高的元素
情况一:当前遍历的元素(柱子)高度小于栈顶元素的高度 height[i] < height[st.top()]
此时构不成凹槽,直接将该元素压入栈内。
情况二:当前遍历的元素(柱子)高度等于栈顶元素的高度 height[i] == height[st.top()]
此时我们想要的是最右边的柱子,所以将栈顶元素弹出,将现在的元素压入栈内。
情况三:当前遍历的元素(柱子)高度大于栈顶元素的高度 height[i] > height[st.top()]
此时已经形成了凹槽,循环计算凹槽大小之后将当前元素压入栈内。
84.柱状图中最大的矩形
单调栈思路:这道题与上道题类似,寻找第一个左边或者右边比其小的数,要注意的是特殊情况,即一直在升或者柱子高度全部相同。如果使用原本的数组,就无法收获结果,于是使用扩展过的数组,即数组两边都加0,这样的话必然收获结果。
暴力解法:循环找第一个最小,自己写的部分超时了,需要改进。
改进部分:不是一个一个寻找最小,而是要借助已经遍历过的部分往过跳。减少了重复次数。
while (j<length&&heights[j]>=heights[i]) j = right[j];