Наивным подходом является O (N³).
Чтобы увидеть, какие суммы из трех равны 0, все суммы вычислены, и существует N * (N-1) * (N-2) / 4 различных суммы.
Но вы можете легко улучшить эту границу, сначала проиндексировав числа, а затем вычислив все суммы пар, сохранив их в хеш-таблице, а затем просмотрите, существует ли отрицательный из сумм, и проверьте, не являются ли его компонентыеще не были использованы для вычисления суммы. Это дает O (N²).
https://en.wikipedia.org/wiki/3SUM
bool threesum(const vector<int>& numbers){
std::unordered_map<int,size_t> index;
for (size_t i=0;i!=numbers.size();++i) {
index.insert({numbers[i],i});
}
for (size_t i=0;i!=numbers.size();++i) {
for (size_t j=i+1;j!=numbers.size();++j) {
const int n = -(numbers[i]+numbers[j]);
if (index.count(n)) {
if (index[n]==i) continue;
if (index[n]==j) continue;
return true;
}
}
}
return false;
}