収集雨水ビス。質問の意味42個の質問は非常に近いですが、2次元から3次元になっています。アイデアはを参照してくださいポストの偉大な神をgrandyang。Javaのと私が持っている問題。
時間O(M * N *ログ(M + N))
スペースO(M * N)
1 クラスソリューション{ 2 のint [] [] DIRS = 新しい INT [] [] {{1,0}、{-1、0}、{0,1}、{0、-1 }}。 3 4 公共 INT trapRainWater(INT [] []ハイト){ 5 INT M = heightMap.length。 6 INT N =(M == 0:ハイト[0 ] .LENGTH)。 7 INT RES = 0 。 8 9 優先度つきキュー< INT []> PQ = 新しい優先度つきキュー<>((A、B) - > [2] - 、B [2 ])。 10個の ブール [] []訪問=新しい ブール[M] [N]。 11 のために(INT iは= 0; I <M; iは++ ){ 12 pq.offer(新しい INT [] {I、0、ハイト[I] [0 ]})。 13 pq.offer(新しい INT [] {I、N - 1、ハイト[I] [N - 1 ]})。 14 訪問[I] [0] [i]は[N - 1]訪問== 真。 15 } 16 のための(int型、J <N - 1、J = 1 J ++ ){ 17 pq.offer(新しい INT [] {0、J、ハイト[0 ] [J]})。 18 pq.offer(新しい INT [] {M - 1、J、ハイト[M - 1 ] [J]})。 19 訪問[0] [j]は[M - 1]訪問= [J] = 真。 20 } 21 22 ながら(!pq.isEmpty()){ 23 のint []セル= pq.poll()。 24 のために(INT [] D:DIRS){ 25 、INT iはセル[0] + D [0]、J =セル[1] + D [1 = ]。 26 もし(I <0 || I> = M || J <0 || J> = N || 訪問[I] [J]){ 27 続けます。 28 } 29の RES + = Math.max(0、セル[2] - ハイト[I] [J])。 30 pq.offer(新しい INT [] {I、J、Math.max(ハイト[I]、[J]、セル[2 ])})。 31 訪問[I] [J] = 真; 32 } 33 } 34の リターンRES。 35 } 36 }