[leetcode] 42 Trapping Rain Water

具体思路就是先计算所有柱子的面积,然后先从左到右然后从右到左把坑填满,计算一个面积

用第二个面积减去第一个面积就是所求,注意各种细节。特殊情况单独讨论。

class Solution {
public:
    int trap(vector<int>& height) {
        //[0,1,0,2,1,0,1,3,2,1,2,1]
        // 0  1 2 3 4 5 6 7 8 9 10
        if(height.empty())
        {
            return 0;
        }
        
        int index=0;
        int max = 0; 
        int maxunm=0;
        int flag=0;
        //寻找最大值的位置
        for (int i = 0; i <height.size(); i++)
            if (height[i] >= height[max]) 
            {
                max = i;
                maxunm=height[max];
            }
        //柱子所占的面积
        int pre=0;
        for(int i=0;i<height.size();i++)
        {
            pre=pre+height[i];
        }
        if(maxunm==0)
        {
            return 0;
        }
        int sum=0;
        if(height.size()<=2)
        {
            return 0;
        }
        for(int i=0,j=1;i<height.size()-2;i++,j++)
        {
            if(i<max)
            {
                if(height[i]>height[j])
                {
                    height[j]=height[i];
                    flag=1;
                }
                else{
                    continue;
                }
            }
            else
            {
                if(height[i]<height[j])
                {
                    height[i]=height[j];
                    flag=1;
                }
                else{
                    continue;
                }
            }
        }
        for(int i=height.size()-2,j=height.size()-1;i>=0;i--,j--)
        {
            if(i<max)
            {
                if(height[i]>height[j])
                {
                    height[j]=height[i];
                    flag=1;
                }
                else{
                    continue;
                }
            }
            else
            {
                if(height[i]<height[j])
                {
                    height[i]=height[j];
                    flag=1;
                }
                else{
                    continue;
                }
            }
        }
        for(int i=0;i<height.size();i++)
        {
            sum=sum+height[i];
        }
        //雨水的面积等于修改过后的面积减去之前柱子的面积
        if(flag==1)
        {
            return sum-pre;
        }
        else
        {
            return 0;
        }
    }
};


你可能感兴趣的:([leetcode] 42 Trapping Rain Water)