难度: 困难
主题: 数组、广度优先搜索、堆(优先队列)、矩阵
给定一个 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”问题是一个具有挑战性的计算问题,需要我们计算二维高程图(表示为矩阵)下雨后积蓄的水量。这个问题将经典的“蓄水池”问题扩展到二维,由于需要考虑所有方向的水流,因此解决方案更加复杂。
heightMap
矩阵包含每个单元格的海拔高度。该解决方案利用广度优先搜索 (BFS) 方法,由优先队列 (最小堆) 指导:
初始化:
插入边界单元格:
BFS 遍历:
返回结果:
让我们在 PHP 中实现此解决方案:407. 蓄水池 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 ?> <h3>解释:</h3> <ol> <li> <p><strong>边界初始化</strong>:</p> <ul> <li>所有边界单元格都添加到堆中,以形成容器的外壁。</li> </ul> </li> <li> <p><strong>堆提取</strong>:</p> <ul> <li>提取高度最低的单元格,确保水只能向外流动,不能向内流动。</li> </ul> </li> <li> <p><strong>邻居探索</strong>:</p> <ul> <li>对于每个邻居:<ul> <li>检查它是否在范围内且未访问。</li> <li>计算积蓄的水量为 max(0, currentHeight - neighborHeight)。</li> <li>将更新后的邻居高度推入堆中。</li> </ul> </li> </ul> </li> <li> <p><strong>累积水</strong>:</p> <ul> <li>将每个邻居的积蓄水量添加到总量中。</li> </ul> </li> </ol> <h2><strong>示例演练</strong></h2> <h3>输入:</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>
边界单元格:
堆遍历:
积蓄的水:
堆操作:
邻居迭代:
*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 相结合的强大功能。通过模拟二维高程图中的水流,我们可以有效地计算积蓄的总水量。由于其对数堆操作,此解决方案对于处理大型矩阵是最佳的。
(此处应包含完整的PHP解决方案代码,由于篇幅限制,我无法在此处提供。请参考原问题描述中的./solution.php
文件获取完整的代码实现。)
以上是。收集雨水 II的详细内容。更多信息请关注PHP中文网其他相关文章!