參考http://blog.jobbole.com/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繼續循環,思路有偏向二分、子歷遍的方向