[leetcode-two pointer] Trapping Rain Water

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!
Tripping Rain Water

解题思路:
首先寻找到数组中的局部极小点, 然后以该极小点为中心向左(left)右(right)两边扩张窗口, 当窗口达到最大时计算窗口之间的容积. 然后重新寻找局部极小点, 重复以上过程.

class Solution {
public:
    int trap(vector<int>& height) {
        if(height.size() <= 2) return 0;
        
        int left = 0, right = 0;
        int sum = 0;
        
        for(int i = 1; i < height.size() - 1; ++i) {
            // 寻找局部极小点
            if(height[i-1] <= height[i] || height[i] > height[i+1]) 
                continue;
            // 寻找极小点的左边边界
            for(left = i-1; left > 0; left--) {
                if(height[left] > height[left-1])
                    break;
            }
            // 寻找极小点的右边边界
            right = i + 1;
            for(int j = i + 1; j < height.size(); ++j) {
                if(height[j] >= height[right]) {
                    right = j;
                    if(height[right] > height[left]) 
                        break;
                }
            }
            // 计算左右边界之间的容量
            int level = min(height[left], height[right]);
            for(int j = left+1; j < right; ++j) {
                if(level > height[j])
                    sum += (level - height[j]);
            }
            // 更新索引值, 为下一个局部极小点做准备
            i = right; 
        }
        return sum;
    }
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,787评论 0 33
  • 如何拆掉思维里的墙?如何打败恐惧?如何让生命更有趣?… 这是一本由书名就深深吸引了我的书,拆掉思维里的墙?这个想法...
    小肺鱼阅读 600评论 0 2
  • 李大拿姓李,东北哈尔滨人,个子一米八几,拥有一双令人羡慕的大长腿。常常抽烟,一身痞气,总体来说还是非常帅气。 不管...
    Carota1933阅读 2,341评论 0 0