Heim >Backend-Entwicklung >PHP-Tutorial >Finden Sie ein Gebäude, in dem sich Alice und Bob treffen können
2940. Finden Sie ein Gebäude, in dem sich Alice und Bob treffen können
Schwierigkeit:Schwer
Themen: Array, Binäre Suche, Stapel, Binärer indizierter Baum, Segmentbaum, Heap (Prioritätswarteschlange), Monotoner Stapel
Sie erhalten ein 0-indiziertes Array mit Höhen positiver Ganzzahlen, wobei heights[i] die Höhe des iten Gebäudes darstellt.
Wenn sich eine Person in Gebäude i befindet, kann sie genau dann in jedes andere Gebäude j umziehen, wenn i < j und heights[i] < heights[j].
Sie erhalten außerdem weitere Array-Abfragen, bei denen query[i] = [ai, bi] ist. Bei der iten Abfrage ist Alice dabei, eini zu bauen, während Bob dabei ist, bi zu bauen.
Gibt ein Array ans zurück, wobei ans[i] der Index des Gebäudes ganz links ist, in dem sich Alice und Bob bei der iten-Abfrage treffen können. Wenn Alice und Bob bei Abfrage i nicht in ein gemeinsames Gebäude umziehen können, setzen Sie ans[i] auf -1.
Beispiel 1:
Beispiel 2:
Einschränkungen:
Hinweis:
Lösung:
Das Problem besteht darin, das Gebäude ganz links zu bestimmen, in dem Alice und Bob sich angesichts ihrer Startgebäude und Bewegungsregeln treffen können. Bei jeder Abfrage geht es darum, einen Treffpunkt anhand der Gebäudehöhe zu finden. Dies ist aufgrund der Bewegungseinschränkungen und der Notwendigkeit einer effizienten Berechnung eine Herausforderung.
Beobachtungen:
Optimierung mit monotonem Stapel:
Abfragesortierung:
Binäre Suche auf Stack:
Abfragen vorverarbeiten:
Durch Abfragen iterieren:
Binäre Suche auf Stack:
Ursprüngliche Bestellung wiederherstellen:
Ergebnisse zurückgeben.
Lassen Sie uns diese Lösung in PHP implementieren: 2940. Finden Sie ein Gebäude, in dem sich Alice und Bob treffen können
<?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)); ?>
Abfragen sortieren:
Monotonen Stapel erstellen:
Abfrageverarbeitung:
[2, 5, -1, 5, 2]
Insgesamt: O(N Q log (Q N)).
Eingabe:
$heights = [6, 4, 8, 5, 2, 7]; $queries = [[0, 1], [0, 3], [2, 4], [3, 4], [2, 2]];
Ausgabe:
print_r(findBuilding($heights, $queries)); // [2, 5, -1, 5, 2]
Dieser Ansatz bewältigt große Einschränkungen effizient, indem er einen monotonen Stapel und eine binäre Suche nutzt. Es gewährleistet eine optimale Abfrageverarbeitung bei gleichzeitiger Wahrung der Korrektheit.
Kontaktlinks
Wenn Sie diese Serie hilfreich fanden, denken Sie bitte darüber nach, dem Repository einen Stern auf GitHub zu geben oder den Beitrag in Ihren bevorzugten sozialen Netzwerken zu teilen? Ihre Unterstützung würde mir sehr viel bedeuten!
Wenn Sie weitere hilfreiche Inhalte wie diesen wünschen, folgen Sie mir gerne:
Das obige ist der detaillierte Inhalt vonFinden Sie ein Gebäude, in dem sich Alice und Bob treffen können. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!