3 回答

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