2577。グリッド内のセルにアクセスするための最小時間
難易度: 難しい
トピック: 配列、幅優先検索、グラフ、ヒープ (優先キュー)、行列、最短パス
非負の整数で構成される m x n 行列グリッドが与えられます。ここで、grid[row][col] はセル (行、これは、セル (行、列) にアクセスした時間がそれ以降である場合にのみ、セル (行、列) にアクセスできることを意味します。グリッド[行][列]. あなたは 0
番目秒目に行列の 左上 セルに立っており、4 番目のいずれか の隣接するセルに移動する必要があります。方向: 上、下、左、右。各動作には 1 秒かかります。 行列の右下のセルにアクセスするために必要な
最小時間を返します。右下のセルにアクセスできない場合は、-1 を返します。
例 1:
m == グリッドの長さ
解決策: 優先キューを使用して、ダイクストラのアルゴリズムの修正バージョンを適用できます。この問題は基本的に、左上のセルから右下のセルに移動するのに必要な最短時間を見つけることを求めます。各移動にはグリッド内の値に基づく時間制約があります。 グラフ表現: グリッド内の各セルをノードとして扱います。エッジは、移動できる隣接するセル (上下左右) です。 優先キュー (最小ヒープ): 優先キューを使用して、常に最小限の時間でセルを探索します。これにより、セルに到達できる最も早い時間から順にセルが処理されるようになります。 修正 BFS: 各セルについて、隣接するセルに移動できるかどうかを確認し、それらのセルにアクセスできる時間を更新します。セルが現在よりも遅い時間にアクセスされた場合、新しい時間でセルをキューに追加し直します。 Early Exit: 右下のセルに到達したら、時間を戻すことができます。キューに到達せずにキューを使い果たした場合は、-1 を返します。 このソリューションを PHP で実装してみましょう: 2577。グリッド内のセルにアクセスするための最小時間 優先キュー: トラバーサル: 訪問したセル: 境界と有効性チェック: 時間計算: エッジケース: 時間計算量: 空間の複雑さ: このソリューションは効率的であり、制約内でうまく機能します。 連絡先リンク このシリーズが役立つと思われた場合は、GitHub で リポジトリ にスターを付けるか、お気に入りのソーシャル ネットワークで投稿を共有することを検討してください。あなたのサポートは私にとって大きな意味を持ちます! このような役立つコンテンツがさらに必要な場合は、お気軽にフォローしてください:
アプローチ:
<?php
/**
* @param Integer[][] $grid
* @return Integer
*/
function minimumTime($grid) {
...
...
...
/**
* go to ./solution.php
*/
}
// Example 1
$grid1 = [
[0, 1, 3, 2],
[5, 1, 2, 5],
[4, 3, 8, 6]
];
echo minimumTime($grid1) . PHP_EOL; // Output: 7
// Example 2
$grid2 = [
[0, 2, 4],
[3, 2, 1],
[1, 0, 4]
];
echo minimumTime($grid2) . PHP_EOL; // Output: -1
?>
説明:
SplPriorityQueue は、最小時間のセルが最初に処理されるようにするために使用されます。 PHP の SplPriorityQueue はデフォルトで最大ヒープであるため、優先度は -time として保存されます。
アルゴリズムは、左上のセル (0, 0) から開始して、各セルにアクセスできる最も早い時間を考慮して、到達可能なすべてのセルを処理します (max(0, Grid[newRow][newCol] - (time 1)))。
訪問された配列は、冗長な計算や無限ループを避けるために、すでに処理されたセルを追跡します。
このアルゴリズムにより、グリッドの境界内に留まり、有効な近傍のみが処理されるようになります。
各移動には 1 秒かかり、セルが待機する必要がある場合 (つまり、grid[newRow][newCol] > time 1)、アルゴリズムは必要な時間まで待機します。
キューが使い果たされ、右下のセルに到達しない場合、関数は -1 を返します。
複雑さの分析
実行例
入力:
<?php
/**
* @param Integer[][] $grid
* @return Integer
*/
function minimumTime($grid) {
...
...
...
/**
* go to ./solution.php
*/
}
// Example 1
$grid1 = [
[0, 1, 3, 2],
[5, 1, 2, 5],
[4, 3, 8, 6]
];
echo minimumTime($grid1) . PHP_EOL; // Output: 7
// Example 2
$grid2 = [
[0, 2, 4],
[3, 2, 1],
[1, 0, 4]
];
echo minimumTime($grid2) . PHP_EOL; // Output: -1
?>
入力:
$grid = [
[0, 1, 3, 2],
[5, 1, 2, 5],
[4, 3, 8, 6]
];
echo minimumTime($grid); // Output: 7
以上がグリッド内のセルを訪問するための最小時間の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。