lintcode363-接雨水

题目描述:

要求能接水的数量。每个位置能不能接水,能接多少水,取决于该位置左右两边的最高高度中的较小者。如果该位置就是从左边开始的最高高度,则该位置不能接水,如果该位置不是左右两边的最高高度,则该位置能接的水量就是左右最高高度中的较小者减去该位置的高度。最左边和最右边不管是不是最高高度,都不能接水。

为能快速得到某一位置左边的最高高度和右边的最高高度,采用两个数组left和right。

left[i] 表示0~i(包括i)的最高高度;  right[i] 表示i~len-1(包括i)的最高高度。

代码:

int trapRainWater(vector<int> &heights) {
        // write your code here
        if(heights.empty())
            return 0;
        
        vector<int> left(heights.size());
        vector<int> right(heights.size());
    
        int maxH = heights[0];
        left[0] = heights[0];
        for(int i=1; i<heights.size(); ++i){
            if(heights[i] < maxH){
                left[i] = left[i-1];
            }
            else{
                left[i] = heights[i];
                maxH = heights[i];
            }
        }
    
        int len = heights.size();
        maxH = heights[len-1];
        right[len-1] = maxH;
        for(int i=len-2; i>=0; --i){
            if(heights[i] < maxH){
                right[i] = right[i+1];
            }
            else{
                right[i] = heights[i];
                maxH = heights[i];
            }
        }
    
        int res = 0;
        for(int i=0; i<heights.size(); ++i){
            if(heights[i] == left[i] || heights[i] == right[i]){
                continue;
            }
    
            int h = min(left[i], right[i]);
            res += (h - heights[i]);
        }
        return res;
    }

猜你喜欢

转载自blog.csdn.net/ddou_pan/article/details/80355821