描述:给定一个非负数组,数组中的元素代表地势等高线,如Array={0,1,3,2,5,0,1};绘制柱形图,柱宽为1,如下图所示:褐色柱形表示地势,蓝色柱形表示能够储存的雨水量。返回4。
分析:能够储存的雨水量高度与左右两侧最高地势有关,height=min(max_left,max_right)-当前地势高度。
对每一个元素申请两个空间分别存储左边最高地势和右边最高地势,再从头遍历到尾部,更新水量。时间复杂度为线性,空间复杂度为线性。
class Solution{
public:
int waterVolumn(int A[],int n)
{
int *max_left=(int *)malloc(sizeof(int)*(n));
int *max_right=(int *)malloc(sizeof(int)*(n));
for(int i=1;i<n;i++)
{
max_left[i]=max_left[i-1]>A[i-1]?max_left[i-1]:A[i-1];
max_right[n-1-i]=max_right[n-i]>A[n-i]?max_right[n-i]:A[n-i];
}
int sum=0;
for(int i=0;i<n;i++)
{
int height=min(max_left[i],max_right[i]);
if(height>A[i])
sum+=height-A[i];
}
return sum;
}
};