搜尋
首頁後端開發php教程找到愛麗絲和鮑伯可以見面的建築物

Find Building Where Alice and Bob Can Meet

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:

  • 輸入: 高度= [6,4,8,5,2,7],查詢= [[0,1],[0,3],[2,4],[3,4] ,[2,2]]
  • 輸出: [2,5,-1,5,2]
  • 解釋: 在第一個查詢中,Alice 和 Bob 可以移動到 2 號樓,因為 heights[0]
  • 在第二個查詢中,Alice 和 Bob 可以移動到 5 號樓,因為 heights[0]
  • 在第三個查詢中,Alice 無法見到 Bob,因為 Alice 無法移動到任何其他建築物。
  • 在第四個查詢中,Alice 和 Bob 可以移動到 5 號樓,因為 heights[3]
  • 在第五個查詢中,Alice 和 Bob 已經在同一棟大樓。
  • 對於 ans[i] != -1,可以證明 ans[i] 是 Alice 和 Bob 可以見面的最左邊的建築物。
  • 對於 ans[i] == -1,可以證明不存在 Alice 和 Bob 可以見面的建築物。

範例2:

  • 輸入: 高度= [5,3,8,2,6,1,4,6],查詢= [[0,7],[3,5],[5,2],[ 3,0],[1,6]]
  • 輸出: [7,6,-1,4,6]
  • 解釋: 在第一個查詢中,Alice 可以直接移動到 Bob 的建築物,因為 heights[0]
  • 在第二個查詢中,Alice 和 Bob 可以移動到 6 號樓,因為 heights[3]
  • 在第三個查詢中,Alice 無法見到 Bob,因為 Bob 無法移動到任何其他建築物。
  • 在第四個查詢中,Alice 和 Bob 可以移動到 4 號樓,因為 heights[3]
  • 在第五個查詢中,Alice 可以直接移動到 Bob 的建築物,因為 heights[1]
  • 對於 ans[i] != -1,可以證明 ans[i] 是 Alice 和 Bob 可以見面的最左邊的建築物。
  • 對於 ans[i] == -1,可以證明不存在 Alice 和 Bob 可以見面的建築物。

約束:

  • 1 4
  • 1 9
  • 1 4
  • 查詢[i] = [ai, bi]
  • 0 i, bi

提示:

  1. 對於每個查詢 [x, y],如果 x > y,請交換x和y。現在,我們可以假設 x
  2. 對於每個查詢 [x, y],如果 x == y 或 heights[x]
  3. 否則,我們需要找到最小的索引 t 使得 y
  4. 要找出每個查詢的索引 t,請按 y 的降序對查詢進行排序。迭代查詢,同時維護單調堆疊,我們可以對其進行二分搜尋以查找索引 t。

解:

這個問題需要根據愛麗絲和鮑伯的起始建築物和移動規則確定最左邊的建築物,愛麗絲和鮑伯可以在其中相遇。每個查詢都涉及根據建築物高度找到交匯點。由於移動的限制和高效計算的需要,這是一個挑戰。

要點

  1. 愛麗絲和鮑伯可以移動到另一棟建築,前提是建築物的高度嚴格大於當前建築。
  2. 對於每個查詢,找到最左邊的有效集合點,如果不存在這樣的建築物,則返回-1。
  3. 這些限制需要一個比簡單的 O(n²) 方法更好的解決方案。

接近

  1. 觀察結果:

    • 如果 a == b,則 Alice 和 Bob 已經在同一棟大樓了。
    • 如果高度[a]
    • 否則,找出最小的建築索引 t >其中:
      • 高度[a]
      • heights[b]
  2. 使用單調堆疊最佳化:

    • 單調堆疊有助於有效追蹤 Alice 和 Bob 可以移動到的有效建築物。建築物添加到堆疊中的方式確保高度按遞減順序排列,從而實現快速二進制搜尋。
  3. 查詢排序:

    • 依 b 的降序對查詢進行排序,以先處理索引較大的建築物。這確保了當我們從較高的索引移動到較低的索引時,我們可以有效地建立堆疊。
  4. 堆疊上的二分查找:

    • 對於每個查詢,在單調堆疊上使用二分查找來找到滿足條件的最小索引t。

計畫

  1. 根據兩個索引 (b) 中較大的一個按降序對查詢進行排序。
  2. 向後遍歷數組,同時維護有效索引的單調堆疊。
  3. 對於每個查詢,檢查簡單情況(a == b 或 heights[a]
  4. 對於重要的情況,使用堆疊透過二分搜尋找到最左邊的有效建築物。
  5. 依照原始查詢順序傳回結果。

解決步驟

  1. 預處理查詢:

    • 確保每個查詢中的 a
    • 依 b 降序對查詢進行排序。
  2. 迭代查詢:

    • 在遍歷陣列時保持單調堆疊。
    • 對於每個查詢:
      • 若 a == b,則答案為 b。
      • 如果高度[a]
      • 否則,使用堆疊找出最小的有效索引 t > b.
  3. 堆疊上的二分查找:

    • 使用二分查找快速找到堆疊上滿足heights[t] > 的最小索引t高度[a]。
  4. 恢復原來的順序:

    • 將結果對應回原始查詢索引。
  5. 回傳結果。

讓我們用 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));
?>

解釋:

  1. 排序查詢: 查詢按 b 降序排序,以首先處理較大的索引,這使我們能夠在處理時更新單調堆疊。
  2. 單調堆疊:堆疊用於追蹤愛麗絲和鮑伯可以見面的建築索引。我們只保留高度比堆疊中任何先前見過的建築物都大的建築物。
  3. 二分查找:在回答每個查詢時,我們使用二分查找來有效地找到滿足條件的最小索引 t。

範例演練

輸入:

  • 高度 = [6,4,8,5,2,7]
  • 查詢 = [[0,1],[0,3],[2,4],[3,4],[2,2]]

過程:

  1. 排序查詢:

    • 索引查詢:[(2,4), (3,4), (0,3), (0,1), (2,2)]
  2. 建立單調堆疊:

    • 從最高索引開始並將索引新增至堆疊:
      • 在索引 5 處:堆疊 = [5]
      • 在索引 4 處:Stack = [5, 4]
      • ...
  3. 查詢處理:

    • 對於查詢[0,1],高度[0]
    • ...

輸出:

[2, 5, -1, 5, 2]

時間複雜度

  1. 查詢排序: O(Q log Q),其中 Q 是查詢數量。
  2. 單調堆疊構造: O(N),其中 N 是高度的長度。
  3. 每個查詢的二分搜尋: O(Q log N)。

總體: 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 上給 存儲庫 一個星號或在您最喜歡的社交網絡上分享該帖子? 。您的支持對我來說意義重大!

如果您想要更多類似的有用內容,請隨時關注我:

  • 領英
  • GitHub

以上是找到愛麗絲和鮑伯可以見面的建築物的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
高流量網站的PHP性能調整高流量網站的PHP性能調整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依賴注入:初學者的代碼示例PHP中的依賴注入:初學者的代碼示例May 14, 2025 am 12:08 AM

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

PHP性能:是否可以優化應用程序?PHP性能:是否可以優化應用程序?May 14, 2025 am 12:04 AM

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

PHP性能優化:最終指南PHP性能優化:最終指南May 14, 2025 am 12:02 AM

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

PHP依賴注入容器:快速啟動PHP依賴注入容器:快速啟動May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依賴注入與服務定位器PHP中的依賴注入與服務定位器May 13, 2025 am 12:10 AM

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

PHP性能優化策略。PHP性能優化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP電子郵件驗證:確保正確發送電子郵件PHP電子郵件驗證:確保正確發送電子郵件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。