Как @PengOne упомянул, что это невозможно в общей схеме вещей.Но если вы наложите некоторые ограничения на данные i / p.
- все элементы все + или все -, если нет, то нужно будет знать диапазон (максимум, минимум) и внести изменения.
- K, сумма двух целых невелика по сравнению с элементами в целом.
- Можно уничтожить массив i / p A [N].
Шаг 1: Переместить всеэлементы меньше чем SUM к началу массива, скажем, в N проходов мы разделили массив на [0, K] & [K, N-1], так что [0, K] содержит элементы <= SUM. </p>
Шаг 2: Поскольку мы знаем границы (от 0 до SUM), мы можем использовать сортировку по основанию.
Шаг 3: Используйте бинарный поиск по A [K], одна хорошая вещь заключается в том, что если нам нужно найти дополнительный элемент, нам нужно посмотреть только половину массива A [K].поэтому в A [k] мы перебираем A [0 - K / 2 + 1], нам нужно выполнить бинарный поиск в A [i - K].
Итак, всего ок.время N + K + K / 2 lg (K), где K - количество элементов от 0 до суммы в i / p A [N]
Примечание: если вы используете подход @ PengOne, вы можете выполнить шаг 3в К. Таким образом, общее время будет N + 2K, что определенно O (N)
Мы не используем никакой дополнительной памяти, но уничтожаем массив i / p, что также неплохо, так как у него не было никакогозаказ для начала.