最近发现一道挺有趣的算法题,题目如下:
给出 n 个非负整数,代表一张X轴上每个区域宽度为 1
的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。
样例
如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1]
, 返回 6
.
解答时产生了2个思路
1:如果p点为最高点,那么p点左边与右边必会出现比p点低的海拔。(此思路错误,因为高低不平时可出现多个类似的点,从而确定不了)
2:水的确定以短板为先决条件,因此以短端向中间横切,会得到凹槽位的存水面积,由于初始化时左右两个极端的可能性已包括,因此不会对结果产生设定条件以外的影响。(此思路正确,无论地形多复杂,按照短板横切也能精准计算)
排除上述思路一后,以下为思路二的实现代码(c语言):
void part_1(int *v,int len)
{
int im=v[0],rm=v[len-1],l=0,r=len-1,warea=0;
while(l<r)
{
if(v[l]<v[r])
{
if(im<v[l])
im=v[l];
else
warea+=im-v[l];
l++;
}
else
{
if(rm<v[r])
rm=v[r];
else
warea+=rm-v[r];
r--;
}
}
printf("可存%d面积水",warea);
}