Как в C++ разделить массив на все элементы?

Дан массив целых чисел и целое число S. Необходимо найти все уникальные пары чисел в массиве, которые в сумме дают S. Каждая пара должна быть представлена в виде кортежа, и порядок не должен иметь значения. Необходимо вывести все такие пары

Вот мое решение:

    srand(time(NULL));

int number = 11;

int count = 0;

const int SIZE = 10;
int arr[SIZE];

for (int i = 0; i < SIZE; i++)
{
    arr[i] = rand() % 17;
}

for (int i = 0; i < SIZE; i++)
{
    for (int j = i + 1; j < SIZE; j++)
    {
        if (arr[i] + arr[j] == number)
        {
            count += 1;
        }
    }

}
cout << count << endl;

}

Оно правильное? Просто если будут 2 числа сумма которых дает 11, но первое будет в начале, а второе в конце, то их не посчитают. Я думаю можно разделить массив на все элементы и каждый элемент складывать со всеми остальными, проверяя условие. Но как это сделать?


Ответы (2 шт):

Автор решения: SurfaceStack

Правильней и быстрее будет решение с двумя указателями:

  1. Сначала сортируем массив в порядке возрастания/убывания
  2. Одним указателем идем с конца, другим - с начала
  3. Складываем число a и число b - если сумма не равна искомому, то переходим дальше. Если сумма равна искомому числу - выводим пару.
→ Ссылка
Автор решения: Никита Самоуков

Решение которое хочет увидеть придумавший эту задачу:

  1. Сначала сортируем массив в порядке возрастания
  2. Одним итератером идем с конца, другим - с начала
  3. Складываем числа под итераторами. Если равна нужному, то вывести пару. Если меньше нужной двигаем итератор с одной стороны, иначе с другой. Когда итераторы равны выходим из цикла.
→ Ссылка