zoukankan      html  css  js  c++  java
  • [LeetCode] 42. Trapping Rain Water 解题思路

    Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

    For example, 
    Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

    The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

    问题: 给定一个数组,每个元素表示海报高度,每个元素宽度均为 1 ,求这个数组能装多少雨水。

    虽然这道题属于 two pointers 类型,不过我是用借助队列来解的。

    可能是因为之前做过直方图相关的题目Largest Rectangle in Histogram ,这道题做起来感觉思路挺顺畅。将数组的值称为泥土体积。

    • 对于从左往右的递增区间,装满雨水后的总体积 - 该区间的总泥土体积 = 该区间的总雨水
    • 对于剩余的从右往左的递增区间,同样地,装满雨水后的总体积 - 该区间的总泥土体积 = 该区间的总雨水

    对于题目中的例子而言,从左往右的递增区间是  [0,1,0,2,1,0,1,3 ], 剩余的从右往左的递增区间是 [ 3,2,1,2,1]。

    class place{
    public:
        int idx;
        int height;
        
        place(int idx, int height){
            this->idx = idx;
            this->height = height;
        }
    };
    
    
    int trap(vector<int>& height) {
        
        if(height.size() == 0){
            return 0;
        }
    
        // 计算从左往右的递增区间
    
        queue<place*> qL;
        
        place* tmpp = new place(0, height[0]);
        
        qL.push(tmpp);
        
        
        for (int i = 1; i < height.size(); i++) {
            
            if (height[i] >= qL.back()->height) {
                place* tmpp = new place(i, height[i]);
                qL.push(tmpp);
            }
        }    
        
        int totalRectL = 0;
        
        while (qL.size() > 1 ) {
            place* tmpp = qL.front();
            qL.pop();
            
            int len = qL.front()->idx - tmpp->idx;
                    
            totalRectL += (tmpp->height * len);
            
        }
        
        place* heighestL = qL.front();
        qL.pop();
        
        int earthAmtL = 0 ;
        for (int i = 0 ; i < heighestL->idx; i++) {
            earthAmtL += height[i];
        }
        
        int waterL = totalRectL - earthAmtL;
        
    
        // 计算剩余的从右往左的递增区间
        queue<place*> qR;
        
        tmpp = new place((int)height.size()-1,height[height.size()-1]);
        
        qR.push(tmpp);
        for (int i = (int)height.size()-2; i >= heighestL->idx; i--) {
            if (height[i] >= qR.back()->height) {
                tmpp = new place(i, height[i]);
                qR.push(tmpp);
            }
        }
        
        int rectR = 0;
        while (qR.size() > 1) {
            place* tmpp = qR.front();
            qR.pop();
            
            int len = tmpp->idx - qR.front()->idx;
                    
            rectR += tmpp->height * len;
        }
        
        place* heighestR = qR.front();
        qR.pop();
        
        int earthAmtR = 0;
        for (int i = (int)height.size()-1; heighestR->idx < i ; i--) {
            earthAmtR += height[i];
        }
        
        int waterR = rectR - earthAmtR;    
    
        int res = waterL + waterR;
        
        return res;
    }

     

  • 相关阅读:
    算法----递归
    函数调用栈、任务队列、事件轮询、宏任务、微任务
    苹果浏览器和ios中,时间字符串转换问题
    npm 命令行基本操作
    一些积累(做阿里笔试题)……
    CSS reset
    一些正则表达式的实例,供参考使用
    不同浏览器获取不同高与宽的方法
    盒子模型
    CSS中的字体样式和文本样式
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/5065070.html
Copyright © 2011-2022 走看看