Если вы предполагаете, что значение M
, для которого пары должны суммироваться, является постоянным и что записи в массиве положительны, то вы можете сделать это за один проход (O(n)
время), используя M/2
указатели (O(1)
пробел) следующим образом. Указатели помечены P1,P2,...,Pk
, где k=floor(M/2)
. Затем сделайте что-то вроде этого
for (int i=0; i<N; ++i) {
int j = array[i];
if (j < M/2) {
if (Pj == 0)
Pj = -(i+1); // found smaller unpaired
else if (Pj > 0)
print(Pj-1,i); // found a pair
Pj = 0;
} else
if (Pj == 0)
Pj = (i+1); // found larger unpaired
else if (Pj < 0)
print(Pj-1,i); // found a pair
Pj = 0;
}
}
Вы можете обрабатывать повторяющиеся записи (например, два 6), сохраняя индексы, например, в виде цифр в базе N
. Для M/2
вы можете добавить условное
if (j == M/2) {
if (Pj == 0)
Pj = i+1; // found unpaired middle
else
print(Pj-1,i); // found a pair
Pj = 0;
}
Но теперь у вас проблема собрать пары.