参考http:///50705/

写的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继续循环,思路有偏向二分、子历遍的方向

两墙之间的最大水量C实现_C

两墙之间的最大水量C实现_二分_02

两墙之间的最大水量C实现_C_03