leetcode数组之Trapping Rain Water

描述
Givennnon-negativeintegersrepresentinganelevationmapwherethewidthofeachbaris1,compute
how much water it is able to trap aer raining.
For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
 leetcode数组之Trapping Rain Water_第1张图片

题意:

给定n个非负整数,代表一个柱状图,每一个柱子的宽度为1,计算下雨之后柱状图能装多少水?

例如:

[0,1,0,2,1,0,1,3,2,1,2,1]  返回 6

//方法一:对于每个柱子,找到其左右两边最高的柱子,该柱子能容纳的面积就是 min(leftMostHeight,rightMostHeight) - height。所以,
//1. 从左往右扫描一遍,对于每个柱子,求取左边最大值;
//2. 从右往左扫描一遍,对于每个柱子,求最大右值;
//3. 再扫描一遍,把每个柱子的面积并累加。
//时间复杂度 O(n),空间复杂度 O(n)
 
//代码一:
int trap(int A[],int len)
{
    if(A==NULL||len<=0)
        return 0;
    int *leftMostHeight=new int[len]();
    int *rightMostHeight=new int[len]();
    
    int maxHeight=0;            //找到数组中每个数其左边最大值,存入数组leftMostHeight;
    for(int i=0;imaxHeight)
            maxHeight=A[i];
    }
     
    maxHeight=0;               //找到数组中每个数其右边最大值,存入数组rightMostHeight;
    for(int j=len-1;j>=0;j--)
    {
        rightMostHeight[j]=maxHeight;
        if(A[j]>maxHeight)
            maxHeight=A[j];
    }
    int water=0;
    for(int k=0;k0)
            water+=curWater;
    }
    delete[]leftMostHeight;
    delete[]rightMostHeight;
    return water;
     
}
//代码二:
int trap(vector &height)
{
    const int len=height.size();
    if(len<=0)
        return 0;
    int leftMostHeight[len];
    int rightMostHeight[len];
    leftMostHeight[0]=0;
    rightMostHeight[len-1]=0;
    for(int i=1;i0)
            water+=curWater;
    }
    
    return water;
}
 

 
//方法二:
//1. 扫描一遍,找到最高的柱子,这个柱子将数组分为两半;
//2. 处理左边一半;
//3. 处理右边一半。
//时间复杂度 O(n),空间复杂度 O(1)
class Solution {  
public:  
   int trap(vector &height)
{
    int len=height.size();
    if(len<=0)
        return 0;
    int max=0;
    for(int i=0;iheight[max])
            max=i;
    }
    int water=0;
    for(int i=0,peak=0;ipeak)
            peak=height[i];
        else
            water+=peak-height[i];
    }
    for(int i=len-1,peak=0;i>max;i--)
    {
        if(height[i]>peak)
            peak=height[i];
        else
            water+=peak-height[i];
    }
    return water;
}
};  


你可能感兴趣的:(leetcode)