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; }
雖然有了答案,但是很多還是沒有想明白,現在在這裡我就不進行講解了,明天會好好思考,附上詳細的解釋。
每天更新一道題,不是因為我懶,只做一道題,而是因為我現在還是個小白,現在在做一道題的時候我還需要去學習一些相關的知識,而且每天白天在實習上班,最近也比較忙,晚上回來還需要寫畢業設計和論文,但是我還是會堅持學習更新部落格的,天天這樣真的感覺非常的充實,而且進步非常明顯,所以我會繼續努力,我相信有一天我可以做演算法題做的得心應手的。