2940。找到爱丽丝和鲍勃可以见面的建筑物
难度:难
主题:数组、二分查找、堆栈、二叉索引树、线段树、堆(优先级队列)、单调堆栈
给你一个0索引正整数高度数组,其中heights[i]代表第i第建筑物的高度。
如果一个人在建筑物 i 中,当且仅当 i
您还会获得另一个数组查询,其中 requests[i] = [ai, bi]。在第 ith 查询中,Alice 正在构建 ai,而 Bob 正在构建 bi。
返回一个数组 ans,其中 ans[i] 是 最左边建筑物的索引,Alice 和 Bob 可以在第 ith 查询中相遇。如果 Alice 和 Bob 无法在查询 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)); ?>
排序查询:
构建单调堆栈:
查询处理:
[2, 5, -1, 5, 2]
总体: O(N Q log (Q N))。
输入:
$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中文网其他相关文章!