兩牆之間的最大水量C實現

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

wKiom1LLwkySjCq4AAA2n8H8m_g675.jpg

wKioL1LLwkCR8hBrAAA8EMyxWcQ449.jpg

wKiom1LLwkyzB-rJAAAx6VXwZ8M646.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章