Heim >Backend-Entwicklung >PHP-Tutorial >. Regenwasser auffangen II
Schwierigkeit: Schwer
Themen: Array, Breitensuche, Heap (Prioritätswarteschlange), Matrix
Anhand einer m x n-Ganzzahlmatrix heightMap
, die die Höhe jeder Zelle in einer 2D-Höhenkarte darstellt, wird die Wassermenge zurückgegeben, die sich nach dem Regen ansammeln kann.
Beispiel 1:
heightMap
= [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3 ,2,3,1]]Beispiel 2:
heightMap
= [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3 ],[3,2,2,2,3],[3,3,3,3,3]]Einschränkungen:
Lösung:
Das „Reservoir II“-Problem ist ein anspruchsvolles Rechenproblem, bei dem wir die nach einem Regenfall angesammelte Wassermenge auf einer zweidimensionalen Höhenkarte (dargestellt als Matrix) berechnen müssen. Dieses Problem erweitert das klassische „Reservoir“-Problem auf zwei Dimensionen, wodurch die Lösung komplexer wird, da Strömungen in alle Richtungen berücksichtigt werden müssen.
heightMap
-Matrix enthält die Höhe jeder Zelle. Die Lösung nutzt den Breadth-First Search (BFS)-Ansatz, der von der Priority Queue (Min Heap) geleitet wird:
Initialisierung:
Randzelle einfügen:
BFS-Durchquerung:
Ergebnis zurückgeben:
Lassen Sie uns diese Lösung in PHP implementieren: 407
<code class="language-php"><?php /** * @param Integer[][] $heightMap * @return Integer */ function trapRainWater($heightMap) { // ... (解决方案代码将在此处) ... } // 示例用法 $heightMap1 = [[1, 4, 3, 1, 3, 2], [3, 2, 1, 3, 2, 4], [2, 3, 3, 2, 3, 1]]; $heightMap2 = [[3, 3, 3, 3, 3], [3, 2, 2, 2, 3], [3, 2, 1, 2, 3], [3, 2, 2, 2, 3], [3, 3, 3, 3, 3]]; echo trapRainWater($heightMap1) . "\n"; // 输出:4 echo trapRainWater($heightMap2) . "\n"; // 输出:10 ?> <h3>Erklärung: </h3> <ol> <li> <p><strong>Grenzinitialisierung</strong>:</p> <ul> <li>Alle Randzellen werden dem Stapel hinzugefügt, um die Außenwand des Behälters zu bilden. </li> </ul> </li> <li> <p><strong>Heap-Extraktion</strong>:</p> <ul> <li>Entnehmen Sie die Zelle mit der niedrigsten Höhe, um sicherzustellen, dass das Wasser nur nach außen und nicht nach innen fließen kann. </li> </ul> </li> <li> <p><strong>Nachbarschaftserkundung</strong>:</p> <ul> <li>Für jeden Nachbarn: <ul> <li>Überprüfen Sie, ob es in Reichweite ist und nicht darauf zugegriffen wird. </li> <li>Berechnen Sie die Menge des angesammelten Wassers als max(0, currentHeight - neighborHeight). </li> <li> Schieben Sie die aktualisierte Nachbarhöhe in den Heap. </li> </ul> </li> </ul> </li> <li> <p><strong>Angesammeltes Wasser</strong>:</p> <ul> <li>Addieren Sie die gespeicherte Wassermenge jedes Nachbarn zur Gesamtmenge. </li> </ul> </li> </ol> <h2><strong>Beispiel-Anleitung</strong></h2> <h3>Geben Sie ein: </h3> <pre class="brush:php;toolbar:false"><code>$heightMap = [ [1, 4, 3, 1, 3, 2], [3, 2, 1, 3, 2, 4], [2, 3, 3, 2, 3, 1] ];</code>
Grenzzelle:
Heap-Traversal:
Wasser gespart:
Heap-Operationen:
Nachbarniteration:
*O(m n log(m n))**
<code>$heightMap = [ [1, 4, 3, 1, 3, 2], [3, 2, 1, 3, 2, 4], [2, 3, 3, 2, 3, 1] ]; echo trapRainWater($heightMap); // 输出:4</code>
Das „Reservoir II“-Problem demonstriert die Leistungsfähigkeit fortschrittlicher Datenstrukturen wie Prioritätswarteschlangen in Kombination mit BFS. Durch die Simulation des Wasserflusses in einer 2D-Höhenkarte können wir die Gesamtmenge des gespeicherten Wassers effizient berechnen. Aufgrund des Log-Heap-Betriebs eignet sich diese Lösung optimal für die Verarbeitung großer Matrizen.
(Der vollständige PHP-Lösungscode sollte hier enthalten sein. Aus Platzgründen kann ich ihn hier nicht bereitstellen. Die vollständige Codeimplementierung finden Sie in der Datei ./solution.php
in der ursprünglichen Problembeschreibung.)
Das obige ist der detaillierte Inhalt von. Regenwasser auffangen II. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!