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;
            
        }
    }
    
  • 相关阅读:
    关于盒模型的外边距padding和内边距margin
    CSS概述(最详细!!!)
    关于html的基本知识
    Maven学习(1)-什么是Maven
    IntelliJ IDEA+Github+Maven+Jenkins+SipringBoot+VUE搭建Web开发环境样例(2)-创建一个简单的查询数据库项目
    IntelliJ IDEA+Github+Maven+Jenkins+SipringBoot+VUE搭建Web开发环境样例(1)-安装与配置
    YARN(待了解)
    Mesos(待了解)
    Kubernetes-中文文档地址(收藏)
    Jenkins学习(4)-Jenkins的API(收藏)
  • 原文地址:https://www.cnblogs.com/reboot329/p/5895847.html
Copyright © 2011-2022 走看看