![](/img/trans.png)
[英]Efficient algo to find number of integers in a sorted array that are within a certain range in O(log(N)) time?
[英]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))復雜性,以便每兩個數字在搜索中相遇?
排序數組 (O(nlogn))
對於每個元素:
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.