#leetcode刷题之路42-接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

 

思路:自左向右查找,以begin找到非零的数字开始,end=beigin+1向后找,可以构成凹槽时则计算,不可以时九八begin位置的高度减1,然后就是for循环不断执行

#include <iostream>
#include <vector>
using namespace std;

int trap(vector<int>& height) {
    if(height.size()==1||height.size()==2||height.size()==0) return 0;
    long begin=0,end=0,count=0,dis=0,i=0;
    int ans=0;
    while(height[i]==0)
    {
        begin++;
        i++;
    }
    //cout<<"begin="<<begin<<endl;
    while(end<height.size())//确定begin,end
    {
        end=begin+1;
        if(end==height.size()) break;
        for(;end<height.size();end++)//找end
        {
            if(height[begin]<=height[end]) break;//判断是否可以构成一个凹槽
        }
        dis=end-begin-1;//距离
        //cout<<"end="<<end<<endl;
        //cout<<"dis="<<dis<<endl;
        if(end!=height.size())//构成凹槽成功
        {

            for(int i=begin+1;i<end;i++)
            {
                count+=height[i];
            }
            ans+=dis*height[begin]-count;//加入面积
            //cout<<"ans="<<ans<<endl;
            begin=end;
            //cout<<"begin="<<begin<<endl;
            dis=0;
            count=0;
        }
        else
        {
            //cout<<"res1="<<height[begin]<<endl;
            height[begin]-=1;
            //cout<<"res2="<<height[begin]<<endl;
            end=begin;
        }
    }
    return  ans;
}

int main() {
    vector<int> a={0,1,0,2,1,0,1,3,2,1,2,1};
    int ans=trap(a);
    std::cout <<ans<< std::endl;
    return 0;
}

 

posted @ 2019-03-27 14:02  maitianpt  阅读(277)  评论(0编辑  收藏  举报