zoukankan      html  css  js  c++  java
  • 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;
            
        }
    }
    
  • 相关阅读:
    python中os.listdir( )函数读取文件夹
    斐讯k2p 月光银 硬件版本A2-软件版本22.7.8.5 刷官改系统
    Ubuntu 16.04 换国内源
    pip和apt-get换源
    Python-OpenCV中的filter2D()函数
    Python-OpenCV中图像合并显示
    Python-OpenCV——Image Blurring(Image Smoothing)
    Python-OpenCV中的resize()函数
    删除Chrome地址栏记录中自动补全的网址
    Python中Numpy mat的使用
  • 原文地址:https://www.cnblogs.com/reboot329/p/5895847.html
Copyright © 2011-2022 走看看