首页 > 代码库 > Leetcode:Trapping Rain Water

Leetcode: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. 

 

解题分析:

对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是min(max_left, max_right) - height

我们从前往后遍历,对于每个柱子,我们可以时刻更新 其左边的最大值,但是 其右边的最大值,我们可以一次次的进行 std::max_element

但是这样  T(n) = O(n^2)

我们可以用空间换时间,首先用一个数组保存 每个柱子右边的最大值,这样 T(n) = O(n)

  1. class Solution {
    public:
        int trap(int A[], int n) {
            assert(A != NULL && n >= 0);
            if (n <= 2) return 0;
            int leftMax = A[0];
            int rightMax[n];
            rightMax[n - 1] = A[n - 1];
            for (int i = n - 2; i >= 0; --i) {
                rightMax[i] = max(A[i+1], rightMax[i+1]);
            }
            int res = 0;
            for (int i = 1; i < n - 1; ++i) {
                leftMax = max(leftMax, A[i-1]);
                int tmp = min(leftMax, rightMax[i]);
                res += max(0, tmp - A[i]);
            }
            return res;
        }
    };