假設我有一個N個非負整數的數組,每個數都可以非常大(0-> 100,000)。我們還假設N可能非常大(〜100,000,000)。在數組中總結數字
對於數組[a0 a1 ... aN-1],我想寫一個函數,它返回整個數組的(-2)^ ai之和。我想有O(n * log(n))時間複雜度和O(n)空間。
例如,取[1 2 3] - 這將返回(-2)^ 1 +(-2)^ 2 +(-2)^ 3 = -6 另一個限制是對於超過100,000,000 ,函數應該返回-1;
甲幼稚(但錯誤的)的解決方案是以下內容:
int solve(vector<int> &A) {
int answer = 0;
for (auto iter = A.begin(); iter != A.end(); ++iter) {
answer += pow(-2, *iter);
}
return (answer <= 1e8) ? answer : -1;
}
這不起作用B/C應答會溢出爲值> 31(假設天然符號整數大小爲4個字節)。對於數組中的值大於63的情況,使用long也不起作用。
我能想到的一個高級解決方案是使用std :: sort對數組進行排序,然後進行排序。對於數組中大於31的值,我們從數組中的值中減去31的倍數。這是可接受的B/C,我們正在處理指數的總和。我很好奇是否有已知的O(n * log(n))複雜度,O(n)空間解決這個問題。
*使用long也不起作用b/c在數組中的值大於63時會失效。* - 如果阻止您實現解決方案的唯一因素是這樣,那麼有些類允許任意大小的整數,例如[boost :: multiprecision](http://www.boost.org/doc/libs/1_63_0/libs/multiprecision/doc/html/boost_multiprecision/intro.html)。 – PaulMcKenzie