zoukankan      html  css  js  c++  java
  • 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!

     

    解决办法:

    从左边i开始,依次匹配知道找到高于height[i]的节点,左边的水容量每个点(height[i] - height[j])的值相加,然后从当前最大的点开始依次匹配。

    但是这样可能出现起点为最大值,所以调整为采用l和r两个指针,维护装水两边的位置。当l处高度低时,说明l右侧装的水肯定和l处一样高,此时逐步右移l,同是加上l处与右移后位置高度差(因为这里都能装水啊),直到再遇到同样高或者更高的位置。然后进行下一轮判断。同样,当r处高度低时,说明r左侧的水肯定和r处一样高,此时逐步左移r,同是加上r处与左移后位置高度差,直到再遇到同样高或者更高的位置。最后直到l和r相遇,结束。

     

    class Solution {
    public:
        int trap(vector<int>& height) {
            int left = 0;
            int right = height.size() - 1;
            int sum = 0;
           
            while( left < right )
            {
                int minh = min( height[left] , height[right]);
                
                if( minh == height[left])
                
                    while(++left<right && height[left] < minh)
                        sum = sum -height[left] + minh; 
                else
                    while(left < --right && height[right] <minh)
                        sum = sum - height[right] + minh; 
            
            }
            return sum;
            
        }
    };
  • 相关阅读:
    C++中派生类使用基类成员的问题
    关于linux安装kettle的总结
    Servlet+JSP教程之:第一个Web程序
    Oracle开启和关闭的四种模式
    Android 图片设置圆角 方法之二
    Hive[6] HiveQL 查询
    JavaScript技巧45招
    JavaScript 权威指南第6版
    js 使用技巧
    Hive[5] HiveQL 数据操作
  • 原文地址:https://www.cnblogs.com/fengyehe/p/5378602.html
Copyright © 2011-2022 走看看