簡體   English   中英

在 O(n * log n) 時間內找到 Array 中加起來等於目標數的兩個元素

[英]Find Two elements in the Array that add up to the Target number in O(n * log n) Time

我對O(n * log(n))搜索算法有疑問。

我必須從一個數組中找到兩個加起來等於給定數字的數字。

我知道O(n * log(n))是如何工作的,但是如果我這樣做,我不確定這兩個正確的數字是否會在搜索中相遇:

for (int i = 0; i < n; i++)
    for (int j = 1; j <= n; j = j*2)

有沒有辦法保持O(n * log(n))復雜性,以便每兩個數字在搜索中相遇?

  1. 排序數組 (O(nlogn))

  2. 對於每個元素:

    2.1 二進制搜索以找到加起來等於給定數字的其他元素(或找出沒有)(O(logn))

步驟 2 的復雜度為 O(nlogn),因此整個算法的復雜度為 O(nlogn)

我必須從一個數組中找到兩個加起來等於定數字的數字

它可以在O(n)時間內完成並利用額外的O(n)空間。

為此,我們可以索引Map中的所有數組元素 映射的關鍵目標總和與特定數組元素和之間的差異 - 元素本身。 地圖的創建需要對源數組進行一次迭代,即花費O(n)時間。

如果目標總和是偶數並且只有一個數組元素完全等於target sum / 2 ,則結果將不正確。 為了處理這種情況,我們可以計算等於總和一半的元素的數量。 它可以與生成地圖的過程同時完成,以避免執行額外的迭代(盡管它與干凈的編碼實踐相矛盾)。

然后我們需要檢查數組中是否存在與map中包含的之一匹配的元素。 如果找到了這樣的元素,那么我們就有一對產生目標總和的數字。

所以我們只需要對源數組執行2次迭代,結果就是O(n)的整體時間復雜度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM