假设我有一个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