- 貯水池 II
難易度: 難しい
トピック: 配列、幅優先検索、ヒープ (優先キュー)、行列
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]] - 出力: 4
-
説明: 雨が降った後、ブロックの間に水が溜まります。
- 私たちには、それぞれ 1 単位と 3 単位の水が入った 2 つの小さなプールがあります。
- 節約できる水の総量は4です。
例 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]] - 出力: 10
制約:
- m == heightMap.length
- n == heightMap[i].length
- 1
- 0
解決策:
「貯水池 II」問題は、2 次元の標高マップ (行列で表される) 上で雨が降った後に蓄積される水の量を計算する必要がある、難しい計算問題です。この問題は古典的な「貯留層」問題を 2 次元に拡張し、全方向の流れを考慮する必要があるため、解決策がより複雑になります。
重要なポイント
-
行列表現:
heightMap
行列には各セルの高度が含まれます。 - 境界制約: 水は境界セルから流出できません。
- ヒープ データ構造: 最小ヒープ (優先キュー) は、水位を動的にシミュレートするために使用されます。
- 訪問行列: セルへの繰り返しの訪問を避けるために、訪問したノードを追跡します。
メソッド
このソリューションは、Priority Queue (Min Heap) に基づいて、Breadth-First Search (BFS) アプローチを利用します。
- すべての境界セルを最小ヒープに追加し、訪問済みとしてマークします。
- セルを高さの昇順に処理します:
- 各セルについて、隣接するセルに水を「溜め込む」ようにしてください。
- 隣接セルとその更新された高さの値をヒープにプッシュします。
- 現在のセルと隣接するセルの高さの差に基づいて、蓄積された水の量を累積します。
計画
-
初期化:
- 行列の次元とエッジケースを定義します。
- 境界セルの最小ヒープを初期化します。
- 訪問済み行列を作成します。
-
境界セルを挿入:
- すべての境界セルとその高さの値をヒープにプッシュします。
- 訪問済みとしてマークします。
-
BFS トラバーサル:
- ヒープが空でない場合は、最も高さの低いセルを抽出します。
- 隣接するものをすべてチェックし、貯水量を計算します:
- 隣の方が低い場合、高低差により貯水量が増加します。
- 隣のセルの方が高い場合は、隣のセルの高さを現在のセルの高さに更新します。
- 近隣ノードをヒープにプッシュし、訪問済みとしてマークします。
-
結果を返します:
- 蓄積水量は、蓄積された雨水の量を表します。
このソリューションを PHP で実装してみましょう: 407. Reservoir II
<?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 ?>
説明:
-
境界の初期化:
- すべての境界セルがパイルに追加されて、コンテナーの外壁が形成されます。
-
ヒープ抽出:
- 水が内側には流れず外側にのみ流れるようにするために、最も高さが低いセルを抽出します。
-
近隣探索:
- 各近隣者:
- 範囲内にあるか、アクセスされていないかを確認します。
- 溜まった水の量をmax(0, currentHeight - neighborsHeight)として計算します。
- 更新された隣接高さをヒープにプッシュします。
- 各近隣者:
-
蓄積水:
- 各隣人の貯水量を合計に加えます。
サンプルウォークスルー
次のように入力します:
<code>$heightMap = [ [1, 4, 3, 1, 3, 2], [3, 2, 1, 3, 2, 4], [2, 3, 3, 2, 3, 1] ];</code>
手順:
-
境界セル:
- 境界セルとその高さをヒープにプッシュします:
- 例: (0, 0, 1)、(0, 1, 4) など。
- 境界セルとその高さをヒープにプッシュします:
-
ヒープトラバーサル:
- セル (0, 0, 1) (最も低い高さ) を抽出します。
- 近隣住民を確認し、節水量を計算します:
- 近隣 (1, 0) の場合: 蓄積された水 = max(0, 1 - 3) = 0。
-
節水:
- すべてのセルにアクセスするまで処理を続けます:
- 節約された水の総量 = 4。
- すべてのセルにアクセスするまで処理を続けます:
時間計算量
-
ヒープ操作:
- 各セルはヒープに 1 回プッシュおよびポップされます: O(m n log(m * n))。
-
近隣反復:
- 各セルには最大 4 つの隣接セルがあります: O(m * n)。
全体の複雑さ:
*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 サイトの他の関連記事を参照してください。

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ドリームウィーバー CS6
ビジュアル Web 開発ツール

メモ帳++7.3.1
使いやすく無料のコードエディター

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

ホットトピック



