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;
    
        }
    
    };

     

你可能感兴趣的:(LeetCode)