Trapping Rain Water

来源:互联网 发布:淘宝客现状 编辑:程序博客网 时间:2024/06/07 03:54

Given n non-negative integers representing anelevation map where the width of each bar is 1, compute how much water it isable to trap after raining.

For example, 
Given [0,1,0,2,1,0,1,3,2,1,2,1],return 6.

思路:逐个点算当前可以存储的最大容量。这里容量算的时候需要考虑左边的最高点和后面最高点,这两个最高点中较小的那个减去A[i]为当前A[i]可以存储的水容量。而求A[i]对应的左边最高点和右边最高点相当于算A[i]之前的最大值,以及A[i]之后的最大值。需要从左到右,以及从右到左分别走一趟来计算。

Refhttp://blog.csdn.net/wzy_1988/article/details/17752809

class Solution {public:int trap(int A[], int n) {   //注意这里A为空,以及n=0是两种不同的情况        if (A == NULL || n == 0) {            return 0;        }                vector<int> left(n, 0);        vector<int> right(n, 0);                left[0] = A[0];        right[n-1] = A[n-1];                int max = A[0];        for(int i = 1; i < n; i++) {            if (A[i] <= max) {                left[i] = max;            }            else if (A[i] > max) {                left[i] = A[i];                max = A[i];            }        }                max = A[n-1];        for (int i = n-2; i>=0; i--) {            if (A[i] <= max) {                right[i] = max;            }            else if (A[i] > max) {                right[i] = A[i];                max = A[i];            }        }                int result = 0;        for (int i = 0; i < n; i++) {            result += (min(left[i], right[i]) - A[i]);        }                return result;             }};


0 0