图不是很全面,应该自己画个例子。。
好像做过一个类似的。
一开始卡在不知道怎么处理一个凹槽之后,假如当前凹槽最右可以和曾经的最高携手共度青春,如何成全。
看了答案发现明明STACK已经记录了当前最高,自己真是蠢。
当下一个比堆顶高的时候,POP一个出来作为初始。
开始POP,一直POP到堆顶比当前高,或者STACK为空。
这是每POP一个计算的面积(除了初始的第一个):
长:当前-将要POP的的index差-1,因为将要POP的还没POP,所以长度-1。(所以如果只有一个比当前,不会计算,或者理解为长是0)
高:将要POP的-已经POP的。
注意STACK里存的是index,因为可以通过INDEX直接获取高度。
int length = i - (stk.peek() + 1);
int hight = height[stk.peek()] - height[lastSmallerIndex];
都POP完了要看看STACK里是不是空的,是的就继续。
不是空的要在添加当前之前,计算当前和STACK里堆顶那个组成的面积。
(i - (stk.peek()+1)) * (height[i]- height[lastSmallerIndex]);
一开始就最后不知道怎么计算,好蠢。更蠢的是最后1.2级运算少了个括号。。debug好久,然后LEETCODE还各种internal error..
public class Solution
{
public int trap(int[] height)
{
if(height.length <= 2) return 0;
Stack<Integer> stk = new Stack<>();
int res = 0;
for(int i = 0; i<height.length;i++)
{
if(stk.isEmpty() || height[i] <= height[stk.peek()])
{
stk.push(i);
}
else
{
int lastSmallerIndex = stk.pop();
int tempVal = 0;
while(!stk.isEmpty() && height[i] >= height[stk.peek()])
{
int length = i - (stk.peek() + 1);
int hight = height[stk.peek()] - height[lastSmallerIndex];
tempVal += length*hight;
lastSmallerIndex = stk.pop();
}
res += tempVal;
if(!stk.isEmpty() && height[stk.peek()] > height[i])
res += (i - (stk.peek()+1)) * (height[i]- height[lastSmallerIndex]);
stk.push(i);
}
}
return res;
}
}