3 回答

TA貢獻1786條經驗 獲得超11個贊
對于k = 4,空間復雜度O(n),時間復雜度O(n 2 * log(n))
對數組進行排序。從最小的2個元素和最大lesser
的2個元素開始(a[i] + a[j])
,以非遞減順序計算2個元素的所有greater
和,(a[k] + a[l])
并以非遞增順序計算2個元素的所有和。lesser
如果總和小于零,則增加總和;如果總和大于零,則增加greater
一;如果總和為零(成功)或a[i] + a[j] > a[k] + a[l]
(失?。?,則停止。
訣竅是遍歷所有索引,i
并且j
這種方式(a[i] + a[j])
永遠不會減少。并且對于k
和l
,(a[k] + a[l])
永遠不應該增加。優先級隊列有助于實現此目的:
放入
key=(a[i] + a[j]), value=(i = 0, j = 1)
優先級隊列。(sum, i, j)
從優先級隊列中彈出。使用
sum
上述算法。把
(a[i+1] + a[j]), i+1, j
和(a[i] + a[j+1]), i, j+1
優先級隊列僅如果不已經使用了這些元素。為了跟蹤使用過的元素,請為每個“ i”維護一個最大使用的“ j”數組。僅使用大于“ i”的“ j”值就足夠了。從步驟2繼續。
對于k> 4
如果將空間復雜度限制為O(n),那么我將無法找到比將蠻力用于k-4
值并將上述算法用于剩余4
值更好的方法。時間復雜度O(n (k-2) * log(n))。
對于非常大的k
整數,線性規劃可能會有所改善。
更新資料
如果n
非常大(與最大整數值相同的順序),則可以實現O(1)優先級隊列,從而提高O(n 2)和O(n (k-2))的復雜度。
如果為n >= k * INT_MAX
,則可以使用具有O(n)空間復雜度的其他算法。為所有可能的k/2
值之和預先計算一個位集。并使用它來檢查其他k/2
值的總和。時間復雜度為O(n (ceil(k / 2)))。
添加回答
舉報