2940。アリスとボブに会える建物を探す
難易度: 難しい
トピック: 配列、二分探索、スタック、バイナリ インデックス付きツリー、セグメント ツリー、ヒープ (優先キュー)、単調スタック
正の整数の 0 インデックス付き 配列の高さが与えられます。heights[i] は i 番目 の建物の高さを表します。
建物 i にいる人は、i
クエリ[i] = [ai, bi] である別の配列クエリも与えられます。 i 番目 クエリでは、アリスは ai を構築しており、ボブは bi を構築しています。
配列 ans を返します。ここで、ans[i] は、i番目のクエリでアリスとボブが会うことができる一番左の建物のインデックス
です。アリスとボブがクエリ i で共通の建物に移動できない場合は、ans[i] を -1 に設定します。例 1:
例 2:
<🎜>制約:
ヒント:
解決策:
この問題では、開始時の建物と移動ルールを考慮して、アリスとボブが会うことができる一番左の建物を決定する必要があります。各クエリには、建物の高さに基づいて待ち合わせ場所を見つけることが含まれます。これは、動きに制約があり、効率的な計算が必要なため、困難です。
所見:
単調スタックを使用した最適化:
クエリの並べ替え:
スタック上の二分探索:
クエリの前処理:
クエリの反復:
スタック上の二分探索:
元の注文を復元:
結果を返します。
このソリューションを PHP で実装してみましょう: 2940。アリスとボブに会える建物を探す
<?php /** * @param Integer[] $heights * @param Integer[][] $queries * @return Integer[] */ function leftmostBuildingQueries($heights, $queries) { ... ... ... /** * go to ./solution.php */ } /** * @param $queries * @return array */ private function getIndexedQueries($queries) { ... ... ... /** * go to ./solution.php */ } /** * @param $stack * @param $a * @param $heights * @return mixed|null */ private function findUpperBound($stack, $a, $heights) { ... ... ... /** * go to ./solution.php */ } class IndexedQuery { public $queryIndex; public $a; // Alice's index public $b; // Bob's index /** * @param $queryIndex * @param $a * @param $b */ public function __construct($queryIndex, $a, $b) { $this->queryIndex = $queryIndex; $this->a = $a; $this->b = $b; } } // Test the function $heights = [6, 4, 8, 5, 2, 7]; $queries = [[0, 1], [0, 3], [2, 4], [3, 4], [2, 2]]; print_r(leftmostBuildingQueries($heights, $queries)); $heights = [5, 3, 8, 2, 6, 1, 4, 6]; $queries = [[0, 7], [3, 5], [5, 2], [3, 0], [1, 6]]; print_r(leftmostBuildingQueries($heights, $queries)); ?> <h3> 説明: </h3> </ul> <ol> <li> <strong>クエリの並べ替え:</strong> クエリは、大きいインデックスを最初に処理するために b で降順に並べ替えられます。これにより、処理中に単調スタックを更新できます。</li> <li> <strong>単調スタック:</strong> スタックは、アリスとボブが出会うことができる建物のインデックスを追跡するために使用されます。以前に確認された建物よりも高い高さの建物のみをスタックに保持します。</li> <li> <strong>二分検索:</strong> 各クエリに答えるとき、二分検索を使用して、条件が満たされる最小のインデックス t を効率的に見つけます。</li> </ol> <h3> <strong>チュートリアルの例</strong> </h3> <h4> 入力: </h4> <ul> <li>身長 = [6,4,8,5,2,7]</li> <li>クエリ = [[0,1],[0,3],[2,4],[3,4],[2,2]]</li> </ul> <h4> プロセス: </h4> <ol> <li> <p><strong>並べ替えクエリ:</strong></p> <ul> <li>インデックス付きクエリ: [(2,4)、(3,4)、(0,3)、(0,1)、(2,2)] </li> </ul> </li> <li> <p><strong>単調スタックの構築:</strong></p> <ul> <li>最も高いインデックスから開始して、スタックにインデックスを追加します。 <ul> <li>インデックス 5: スタック = [5] </li> <li>インデックス 4: スタック = [5, 4] </li> <li>...</li> </ul> </li> </ul> </li> <li> <p><strong>クエリ処理:</strong></p> <ul> <li>クエリ [0,1] の場合、高さ [0] </li> <li>...</li> </ul> </li> </ol> <h4> 出力: </h4> <p>[2、5、-1、5、2]</p> <h3> <strong>時間計算量</strong> </h3> <ol> <li> <strong>クエリの並べ替え:</strong> O(Q log Q) ここで、Q はクエリの数です。</li> <li> <strong>単調スタック構造:</strong> O(N) ここで、N は高さの長さです。</li> <li> <strong>各クエリの二分検索:</strong> O(Q log N).</li> </ol> <p><strong>全体:</strong> O(N Q log (Q N)).</p> <h3> <strong>出力例</strong> </h3> <p><strong>入力:</strong><br> </p> <pre class="brush:php;toolbar:false">$heights = [6, 4, 8, 5, 2, 7]; $queries = [[0, 1], [0, 3], [2, 4], [3, 4], [2, 2]];
出力:
print_r(findBuilding($heights, $queries)); // [2, 5, -1, 5, 2]
このアプローチは、単調スタックと二分探索を活用することで、大きな制約を効率的に処理します。これにより、正確性を維持しながら最適なクエリ処理が保証されます。
連絡先リンク
このシリーズが役立つと思われた場合は、GitHub で リポジトリ にスターを付けるか、お気に入りのソーシャル ネットワークで投稿を共有することを検討してください。あなたのサポートは私にとって大きな意味を持ちます!
このような役立つコンテンツがさらに必要な場合は、お気軽にフォローしてください:
以上がアリスとボブに会える建物を探すの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。