42. Trapping Rain Water

来源:互联网 发布:漓江学院 知乎 编辑:程序博客网 时间:2024/05/17 04:03

此道题目不太好想,看了答案才明白。中心思想是:每个bar头顶能接多少水,取决于它两边有没有比自己高的两个bar。有的话,这个bar头顶就能够存住水,可以存住的水的体积为(比自己高的两个bar之中较短的那个bar高度-这个bar的高度)*1。然后就要考虑,怎么求每个bar左边最高bar及右边最高bar的高度。其实用DP就可以了,这个跟LIS很像。代码如下。

class Solution {public:    int trap(vector<int>& A) {        int n = A.size();        int res = 0;        vector<int>rightMax (n);//bar右边最高的bar的高度        int maxv = 0;        for(int i = n-1; i >= 0; i--)        {            rightMax[i] = maxv; // 最右边的bar其右边最高bar的高度肯定为0            if(maxv < A[i])                maxv = A[i];        }        maxv = 0;        int conHeight;        for(int i = 0; i < n; i++)        {//此时maxv为bar i左边最高的bar的高度            conHeight = min(maxv, rightMax[i]); // 左右最高bar较短的bar的高度            if(conHeight > A[i])                res += conHeight - A[i];            if(maxv<A[i])                maxv=A[i];        }        return res;    }};


0 0
原创粉丝点击