Nが負でない整数の配列を持ち、それぞれが非常に大きくなる可能性があるとします(0-> 100,000)。また、Nが非常に大きい(〜100,000,000)と仮定しましょう。配列の数値を集計する
配列[a0 a1 ... aN-1]については、配列全体に対して(-2)^ aiの合計を返す関数を記述したいと思います。私はO(n * log(n))時間の複雑さとO(n)の空間を持っていたいと思います。
たとえば、(-2)^ 1 +(-2)^ 2 +(-2)^ 3 = -6を返します。 もう1つの制約は、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の答えが(ネイティブ符号付き整数のサイズは4バイトであると仮定して)> 31値のオーバーフローする働きません。 longを使用すると、配列の値が63より大きいb/cも機能しません。
高水準の解決策は、std :: sortを使用して配列をソートしてからそれを歩くことです。配列の値が31より大きい場合は、配列の値から31を引いて、31の倍数を除外します。これは、指数の合計を扱っている場合でも受け入れ可能です。この問題に対する既知の、O(n * log(n))の複雑さ、O(n)の空間解があるなら、私は興味がありました。
* longを使用すると、配列の値が63より大きいb/cも機能しません。* - ソリューションの実装を妨げる唯一の事がこれである場合、任意のサイズの整数を許可するクラスがあります例えば、[boost :: multiprecision](http://www.boost.org/doc/libs/1_63_0/libs/multiprecision/doc/html/boost_multiprecision/intro.html)などです。 – PaulMcKenzie