難易度: 難しい
トピック: 配列、幅優先検索、ヒープ (優先キュー)、行列
2D 標高マップの各セルの高さを表す m x n 整数行列 heightMap
が与えられた場合、雨が降った後に蓄積できる水の量を返します。
例 1:
heightMap
= [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3 ,2,3,1]]例 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]]制約:
解決策:
「貯水池 II」問題は、2 次元の標高マップ (行列で表される) 上で雨が降った後に蓄積される水の量を計算する必要がある、難しい計算問題です。この問題は古典的な「貯留層」問題を 2 次元に拡張し、全方向の流れを考慮する必要があるため、解決策がより複雑になります。
heightMap
行列には各セルの高度が含まれます。 このソリューションは、Priority Queue (Min Heap) に基づいて、Breadth-First Search (BFS) アプローチを利用します。
初期化:
境界セルを挿入:
BFS トラバーサル:
結果を返します:
このソリューションを PHP で実装してみましょう: 407. Reservoir II
<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 ?></code>
境界の初期化:
ヒープ抽出:
近隣探索:
蓄積水:
<code>$heightMap = [ [1, 4, 3, 1, 3, 2], [3, 2, 1, 3, 2, 4], [2, 3, 3, 2, 3, 1] ];</code>
境界セル:
ヒープトラバーサル:
節水:
ヒープ操作:
近隣反復:
*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>
「リザーバー II」問題は、BFS と組み合わせた優先キューなどの高度なデータ構造の力を示しています。 2D 標高マップで水の流れをシミュレーションすることで、貯留される水の総量を効率的に計算できます。ログ ヒープ操作により、このソリューションは大規模な行列の処理に最適です。
(完全な PHP ソリューション コードをここに含める必要があります。スペースの制限があるため、ここでは提供できません。完全なコード実装については、元の問題の説明にある ./solution.php
ファイルを参照してください。)
以上が。雨水をためるⅡの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。