题目链接:https://leetcode.com/problems/trapping-rain-water/description/

 

思路:

1、先找到最左侧第一个高度不为0的柱子i。

2、从i+1开始向右侧找另一个柱子max。条件:要么a[max] > a[i],要么a[max] > 右侧所有。

1) 向右侧遍历,当遇到第一个比a[i]高的柱子,相当于遇到一座山,这个柱子会把左右两侧的池子给隔开。

所以,如果遇到第一个比a[i]高的柱子,就停下来。这时候就产生了一个和右侧隔开的池子。

2) 如果找到最后,一直没有遇到比a[i]还高的,那就取右侧最高的那个作为max。

a[max] 和 a[i]组成一个和右侧隔开的池子。

池子的面积就是 min(a[max] , a[i]) * (max - i - 1) - sum(a[i+1]...a[max-1])

 

3、把i定位到max,重复上述过程。以max为起点,找下一个池子。

 

show me the code:

class Solution {
public:
    int trap(vector<int>& height) {
        vector<int> &a = height;
        int i,n = a.size();
        int sum = 0;
        for(i = 0 ;i < n - 1; )
        {
            while(i < n -1 && a[i] == 0)    ++i;
            
            int max = i + 1;        //i右侧最大值的下标
            
            for(int j = i+1; j < n; j++)
            {
                if(a[j] > a[max])   max = j;
                if(a[max] > a[i])   break;
            }
            
            sum += min(a[i],a[max])*(max - i - 1);
            
            for(int j = i+1; j< max; j++)   
                sum -= a[j];
            
            i = max;
        }
        
        return sum;
    }
};

 

posted on 2017-12-10 13:57  newbird2017  阅读(94)  评论(0编辑  收藏  举报