写的C语言实现~~~哈哈~~其实文章下面代码已经有python的实现了~但我比较看得惯C语言~而且自己跟着写一遍的话比较容易有印象~~~(具体解析参考文章相当详细~~)
#include <stdio.h>
int calculate(int * arr, int len)
{
int cal = 0;
int p_l = 0 ;
int p_r = len - 1;
int max_l = arr[p_l];
int max_r = arr[p_r];
while(p_r > p_l)
{
if(max_l < max_r)
{
p_l = p_l + 1;
if(arr[p_l] >= max_l)
{
max_l = arr[p_l];
}
else
{
cal = cal + (max_l - arr[p_l]);
}
}
else
{
p_r = p_r - 1;
if(arr[p_r] >= max_r)
{
max_r = arr[p_r];
}
else
{
cal = cal + (max_r - arr[p_r]);
}
}
}
return cal;
}
int main(void)
{
// int arr[9]={2,5,1,2,3,4,7,7,6};
// int arr[9]={2,5,1,3,1,2,1,7,6};
int arr[9]={2,5,1,3,1,2,1,1,1};
int len = sizeof(arr) / sizeof(int);
int cal = calculate(arr,len);
printf("the Max calculate is : %d\n",cal);
return 0;
}大意为:
从左边开始找最高的墙M,找到后,如果知道它右边的墙A的值是多少,那么就知道MA之间的水量是多少;之后继续看是否需要更新最高墙的值,水量一直等于 = 某墙右边的墙和某墙之间的水量之和。
同理,右边历遍也如此~~~
只要p_l<p_r继续循环,思路有偏向二分、子历遍的方向




















