1. 程式人生 > >LeetCode刷題記錄(第五天)

LeetCode刷題記錄(第五天)

Trapping Rain Water

原題目:

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

翻譯後:

給定n個非負整數來表示每個柱的寬度為1的高程圖,計算下雨後它能夠捕集多少水。

解釋:

首先看到題後(翻譯後的。。。。),我最想知道的就是:高程圖是什麼?

高程圖:用來表示某一區域海撥高低(即高程)的圖紙。。。。百度百科中只有這一句解釋,大致知道了題目是什麼意思,就是說這n個非負數代表高度,當下雨的時候可以有多少的積水。但是理解是理解了,並不是非常的形象,還不知道什麼情況可以有積水,幸好還有一個事例。

事例:

例如,
給定[0,1,0,2,1,0,1,3,2,1,2,1],返回6

這下就直觀多了,就是高度為數值,能積水多少就是看兩個高度之間最低的了,有點像木桶原理。第一個和最後一個無論是多少,都無法積水,因為邊上是空著的,所以主要還是從陣列的[1]和[length()-2]來判斷。、

思路:

我的想法是先找到最高的地方,也就是最大值,然後找出去它後的最大值,然後計算中間的面積,再減去中間包含的高度面積,最後知道找到最低的,把算出來的面積都相加起來,就是積水數量。但是按照我的思路,在實現的時候還是存在很多我無法解決的問題。而且需要進行很多次的判斷,效率上非常低效,所以我還是學習了大神的程式碼:

public int trap(int[] A){
    int a=0;
    int b=A.length-1;
    int max=0;
    int leftmax=0;
    int rightmax=0;
    while(a<=b){
        leftmax=Math.max(leftmax,A[a]);
        rightmax=Math.max(rightmax,A[b]);
        if(leftmax<rightmax){
            max+=(leftmax-A[a]);       // leftmax is smaller than rightmax, so the (leftmax-A[a]) water can be stored
            a++;
        }
        else{
            max+=(rightmax-A[b]);
            b--;
        }
    }
    return max;
}

雖然有了答案,但是很多還是沒有想明白,現在在這裡我就不進行講解了,明天會好好思考,附上詳細的解釋。

每天更新一道題,不是因為我懶,只做一道題,而是因為我現在還是個小白,現在在做一道題的時候我還需要去學習一些相關的知識,而且每天白天在實習上班,最近也比較忙,晚上回來還需要寫畢業設計和論文,但是我還是會堅持學習更新部落格的,天天這樣真的感覺非常的充實,而且進步非常明顯,所以我會繼續努力,我相信有一天我可以做演算法題做的得心應手的。