Kesukaran: Sukar
Topik: Tatasusunan, carian luas-dahulu, timbunan (baris gilir keutamaan), matriks
Diberikan matriks integer m x n heightMap
yang mewakili ketinggian setiap sel dalam peta ketinggian 2D, kembalikan jumlah air yang boleh terkumpul selepas hujan.
Contoh 1:
heightMap
= [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3 ,2,3,1]]Contoh 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]]Kekangan:
Penyelesaian:
Masalah "Reservoir II" ialah masalah pengiraan yang mencabar yang memerlukan kita mengira jumlah air terkumpul selepas hujan turun pada peta ketinggian dua dimensi (diwakili sebagai matriks). Masalah ini memanjangkan masalah "takungan" klasik kepada dua dimensi, menjadikan penyelesaiannya lebih kompleks kerana aliran ke semua arah perlu dipertimbangkan.
heightMap
mengandungi ketinggian setiap sel. Penyelesaian menggunakan pendekatan Breadth-First Search (BFS), dipandu oleh Baris Keutamaan (Timbunan Min):
Permulaan:
Masukkan sel sempadan:
Perjalanan BFS:
Hasil pulangan:
Mari laksanakan penyelesaian ini dalam 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 ?> <h3>Penjelasan: </h3> <ol> <li> <p><strong>Permulaan sempadan</strong>:</p> <ul> <li>Semua sel sempadan ditambah pada longgokan untuk membentuk dinding luar bekas. </li> </ul> </li> <li> <p><strong>Pengeluaran timbunan</strong>:</p> <ul> <li>Ekstrak sel dengan ketinggian paling rendah untuk memastikan air hanya boleh mengalir keluar dan tidak masuk. </li> </ul> </li> <li> <p><strong>Penerokaan Jiran</strong>:</p> <ul> <li>Untuk setiap jiran: <ul> <li> Semak sama ada ia berada dalam julat dan tidak diakses. </li> <li>Kira jumlah air terkumpul sebagai max(0, currentHeight - neighborHeight). </li> <li> Tolak ketinggian jiran yang dikemas kini ke dalam timbunan. </li> </ul> </li> </ul> </li> <li> <p><strong>Air terkumpul</strong>:</p> <ul> <li>Tambahkan jumlah air simpanan setiap jiran kepada jumlah keseluruhan. </li> </ul> </li> </ol> <h2><strong>Contoh Panduan</strong></h2> <h3>Masukkan: </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>
Sel sempadan:
Perjalanan timbunan:
Air yang disimpan:
Operasi timbunan:
Lelaran Jiran:
*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>
Masalah "Reservoir II" menunjukkan kekuatan struktur data lanjutan seperti baris gilir keutamaan digabungkan dengan BFS. Dengan mensimulasikan aliran air dalam peta ketinggian 2D, kita boleh mengira jumlah air yang disimpan dengan cekap. Disebabkan oleh operasi timbunan log, penyelesaian ini adalah optimum untuk memproses matriks besar.
(Kod penyelesaian PHP yang lengkap harus disertakan di sini. Disebabkan keterbatasan ruang, saya tidak dapat menyediakannya di sini. Sila rujuk fail ./solution.php
dalam huraian masalah asal untuk pelaksanaan kod yang lengkap.)
Atas ialah kandungan terperinci . Memerangkap Air Hujan II. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!