美文网首页
42. 接雨水

42. 接雨水

作者: HITZGD | 来源:发表于2018-12-10 20:51 被阅读0次

    题目
    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

    image.png

    示例:
    输入: [0,1,0,2,1,0,1,3,2,1,2,1]
    输出: 6

    思路

    image.png
    自己在纸上画了一下思路,在上图,黑色虚线表示从左往右搜索的最大值,红色虚线表示从右往左搜索的最大值。有了这两个数组,对每一个柱子(立方体)取left和right最小值,这个最小值就是对应了水面的顶(如果有的话),用这个顶减去当前柱子的高度(水面的底),就是这个位置处对应的水量。由此得到结果。
    #include <vector>
    #include <algorithm>
    using namespace std;
    class Solution {
    public:
        int trap(vector<int>& height) {
            int size = height.size();
            vector<int> left(size), right(size);
            for (int i = 1; i < size; i++)
                left[i] = max(left[i - 1], height[i - 1]);
            for (int i = size - 2; i >= 0; i--)
                right[i] = max(right[i + 1], height[i + 1]);
            int water = 0;
            for (int i = 0; i < size; i++)
            {
                int level = min(left[i], right[i]);
                water += max(0, level - height[i]);
            }
            return water;
        }
    };
    
    int main(int argc, char* argv[])
    {
        vector<int> test = { 0,1,0,2,1,0,1,3,2,1,2,1 };
        auto res = Solution().trap(test);
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:42. 接雨水

          本文链接:https://www.haomeiwen.com/subject/onodhqtx.html