leetcode 42:接雨水

首先先找到第一个height[i]>height[i+1]的点  然后先往后寻找大于等于height[i]的位置,如果没有,寻找大于height[i+1]的最大点

int trap(std::vector<int>& height) {
    if(height.size()<=2)
        return 0;
    int i=0;
    int sum=0;
    int c=0;
    int max=0;
    int c1=-1;
    while(i<height.size()-2){
            max=0;
            c1=-1;
            if(height[i]>height[i+1]){
                c=0;
                int j=i+1;
                for(;j<height.size();j++){
                    if(height[j]>=height[i])
                    {
                        int d=height[i];
                        sum+=d*(j-i-1)-c;
                        i=j;
                        break;
                    }
                    c+=height[j];
                }
                if(j==height.size())
                {
                    c=0;
                    int k=i+2;
                    for(;k<height.size();k++){
                        if(height[k]>height[i+1])
                        {
                            if(height[k]>max){
                                max=height[k];
                                c1=k;
                            }
                        }
                    }
                    if(c1!=-1)
                    {
                        int d=height[i]<height[c1]?height[i]:height[c1];
                        for(int t=i+1;t<c1;t++){
                            c+=height[t];
                        }
                        sum+=d*(c1-i-1)-c;
                        i=c1;
                    }else
                        i++;
                }
            }else
                i++;
    }
    return sum;
}

猜你喜欢

转载自blog.csdn.net/u013263891/article/details/83758633