標籤:
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.
For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
我做題,一般是按照AC率排序選著做的,這道題一不留神,難度居然還是Hard,好吧,確實也難到了我。AC率居然還蠻高,我也是提交了3次之後才AC的。先說說我前兩次的錯誤思路:第一次,我是對每一個點,往兩邊找最長升序,然後以左右兩邊的這兩個序列的和作為一個坑,用來填雨水。但是針對[5,1,2,1,2,1,2,5]這樣的序列,即在區間內部的升降,其實並不影響其盛水,故WA!第二次個人認為也是能完成的,但是需要考慮的情況比較多,比較煩人,不是最合適的方法,方法是從左至右掃描,掃到第一個比當前高的,作為一個區間,接著從區間末開始繼續往後掃,以此類推,這方法能解決上面的問題,但是最後一個區間需要單獨考慮。
其實是可以這樣解決的:先找到最高的那個問題maxhigh,然後分別從兩邊往這個節點遍曆,設定一個次高點temphigh,
如果當前節點比次高點高,則更新次高點,繼續;
否則,用次高點減去當前節點,就是我們能盛水的體積。
就是這麼簡單粗暴,唯一的缺陷就是需要兩次掃描,有強迫症的或者追求完美主意的,可以查看下網上的一個方法,是直接從兩邊開始掃描的,一次搞定。個人感覺代碼看上去不夠直觀。
下面貼一下我自己的代碼:
class Solution: # @param A, a list of integers # @return an integer def trap(self, A): res = 0 if len(A) < 3: return 0 maxv = 0 maxid = 0 for i in range(len(A)): if A[i] > maxv: maxv = A[i] maxid = i temphigh = 0 for j in range(maxid): if A[j] > temphigh: temphigh = A[j] else: res += temphigh - A[j] temphigh = 0 for j in range(len(A)-1,maxid,-1): if A[j] > temphigh: temphigh = A[j] else: res += temphigh - A[j] return res
【leetcode】Trapping Rain Water