42. Trapping Rain Water

image
图不是很全面,应该自己画个例子。。
好像做过一个类似的。

一开始卡在不知道怎么处理一个凹槽之后,假如当前凹槽最右可以和曾经的最高携手共度青春,如何成全。

看了答案发现明明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;
        
    }
}
posted @ 2016-09-22 12:38  哇呀呀..生气啦~  阅读(159)  评论(0编辑  收藏  举报