"lintcode" 364.Trapping Rain Water II
Last Update:2017-06-22
Source: Internet
Author: User
<span id="Label3"></p><p><p>Topic:</p></p><p><p>Given <em>n</em> x <em>m</em> non-negative integers representing an elevation map 2d where the area of each cell is <em>1< /c2> x <em>1</em>, compute how much water it's able to trap after raining.</em></p></p><p><p></p></p><strong><strong>Example</strong></strong><p><p>Given <code>5*4</code> Matrix</p></p><pre><pre><code>[12,13,0,12][13,4,13,12][13,8,10,12][12,13,12,12][13,13,13,13]</code></pre></pre><p><p>Return <code>14</code> .</p></p><p><p>Exercises</p></p><p><p>The previous question is two pointer, which is essentially traversing the center at a given boundary, which is also, but the boundary is changed from both ends to four sides, which is also an inward-shrinking traversal. The problem also requires a heap of thought to traverse from the smallest end (to prevent leaks). See Here.</p></p><p><p>Solution 1 () (from here to Granyang)</p></p><pre><span style="color: #0000ff"><span style="color: #0000ff">class</span></span><span style="color: #000000"><span style="color: #000000">Solution {</span></span><span style="color: #0000ff"><span style="color: #0000ff"></span> public</span><span style="color: #000000"><span style="color: #000000">: </span></span><span style="color: #0000ff"><span style="color: #0000ff">int</span></span>Traprainwater (vector<vector<<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>> > &<span style="color: #000000"><span style="color: #000000">Heightmap) { </span></span><span style="color: #0000ff"><span style="color: #0000ff">if</span></span><span style="color: #000000"><span style="color: #000000">(heightmap.empty ()) {</span></span><span style="color: #0000ff"><span style="color: #0000ff">return</span></span> <span style="color: #800080"><span style="color: #800080">0</span></span><span style="color: #000000"><span style="color: #000000">; } </span></span><span style="color: #0000ff"><span style="color: #0000ff">int</span></span>m = heightmap.size (), n = heightmap[<span style="color: #800080"><span style="color: #800080">0</span></span><span style="color: #000000"><span style="color: #000000">].size (); </span></span><span style="color: #0000ff"><span style="color: #0000ff">int</span></span>res =<span style="color: #800080"><span style="color: #800080">0</span></span>, mx =<span style="color: #000000"><span style="color: #000000">int_min; Priority_queue</span></span><pair<<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>,<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>, vector<pair<<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>,<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>>>,greater<pair<<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>,<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>>>><span style="color: #000000"><span style="color: #000000">q; Vector</span></span><vector<<span style="color: #0000ff"><span style="color: #0000ff">BOOL</span></span>>> visited (m, vector<<span style="color: #0000ff"><span style="color: #0000ff">BOOL</span></span>> (n,<span style="color: #0000ff"><span style="color: #0000ff">false</span></span><span style="color: #000000"><span style="color: #000000">)); Vector</span></span><vector<<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>>> dir{{<span style="color: #800080"><span style="color: #800080">0</span></span>, -<span style="color: #800080"><span style="color: #800080">1</span></span>}, {-<span style="color: #800080"><span style="color: #800080">1</span></span>,<span style="color: #800080"><span style="color: #800080">0</span></span>}, {<span style="color: #800080"><span style="color: #800080">0</span></span>,<span style="color: #800080"><span style="color: #800080">1</span></span>}, {<span style="color: #800080"><span style="color: #800080">1</span></span>,<span style="color: #800080"><span style="color: #800080">0</span></span><span style="color: #000000"><span style="color: #000000">}}; </span></span><span style="color: #0000ff"><span style="color: #0000ff"></span> for</span>(<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>i =<span style="color: #800080"><span style="color: #800080">0</span></span>; I < m; ++<span style="color: #000000"><span style="color: #000000">I) {</span></span><span style="color: #0000ff"><span style="color: #0000ff"></span> for</span>(<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>j =<span style="color: #800080"><span style="color: #800080">0</span></span>; J < n; ++<span style="color: #000000"><span style="color: #000000">J) {</span></span><span style="color: #0000ff"><span style="color: #0000ff">if</span></span>(i = =<span style="color: #800080"><span style="color: #800080">0</span></span>|| i = = m-<span style="color: #800080"><span style="color: #800080">1</span></span>|| j = =<span style="color: #800080"><span style="color: #800080">0</span></span>|| j = = n-<span style="color: #800080"><span style="color: #800080">1</span></span><span style="color: #000000"><span style="color: #000000">) {q.push ({heightmap[i][j], i</span></span>* n +<span style="color: #000000"><span style="color: #000000">j}); visited[i][j]</span></span>=<span style="color: #0000ff"><span style="color: #0000ff">true</span></span><span style="color: #000000"><span style="color: #000000">; } } } </span></span><span style="color: #0000ff"><span style="color: #0000ff"></span> while</span>(!<span style="color: #000000"><span style="color: #000000">Q.empty ()) {auto T</span></span>=<span style="color: #000000"><span style="color: #000000">Q.top (); Q.pop (); </span></span><span style="color: #0000ff"><span style="color: #0000ff">int</span></span>H = t.first, r = t.second/n, C = t.second%<span style="color: #000000"><span style="color: #000000">n; MX</span></span>=<span style="color: #000000"><span style="color: #000000">Max (mx, h); </span></span><span style="color: #0000ff"><span style="color: #0000ff"></span> for</span>(<span style="color: #0000ff"><span style="color: #0000ff">int</span></span>i =<span style="color: #800080"><span style="color: #800080">0</span></span>; I < dir.size (); ++<span style="color: #000000"><span style="color: #000000">I) {</span></span><span style="color: #0000ff"><span style="color: #0000ff">int</span></span>x = r + dir[i][<span style="color: #800080"><span style="color: #800080">0</span></span>], y = c + dir[i][<span style="color: #800080"><span style="color: #800080">1</span></span><span style="color: #000000"><span style="color: #000000">]; </span></span><span style="color: #0000ff"><span style="color: #0000ff">if</span></span>(x <<span style="color: #800080"><span style="color: #800080">0</span></span>|| X >= m | | Y <<span style="color: #800080"><span style="color: #800080">0</span></span>|| Y >= N | | visited[x][y] = =<span style="color: #0000ff"><span style="color: #0000ff">true</span></span>)<span style="color: #0000ff"><span style="color: #0000ff">Continue</span></span><span style="color: #000000"><span style="color: #000000">; visited[x][y]</span></span>=<span style="color: #0000ff"><span style="color: #0000ff">true</span></span><span style="color: #000000"><span style="color: #000000">; </span></span><span style="color: #0000ff"><span style="color: #0000ff">if</span></span>(heightmap[x][y] < mx) res + = mx-<span style="color: #000000"><span style="color: #000000">heightmap[x][y]; Q.push ({heightmap[x][y], x</span></span>* n +<span style="color: #000000"><span style="color: #000000">y}); } } </span></span><span style="color: #0000ff"><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="color: #000000">res; }};</span></span></pre><p><p></p></p><p><p>"lintcode" 364.Trapping Rain Water II</p></p></span>