储水量

描述:给定一个非负数组,数组中的元素代表地势等高线,如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;
	}
}; 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值