标签:c style class blog code java
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)
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:Trapping Rain Water,布布扣,bubuko.com
标签:c style class blog code java
原文地址:http://www.cnblogs.com/wwwjieo0/p/3778620.html