Если у вас есть диапазон, в котором находятся целые числа, вы можете использовать решение для сортировки по типу подсчета, где вы сканируете массив и подсчитываете массив. Например, у вас есть целые числа
input = [0,1,5,2,6,4,2]
И вы создаете массив следующим образом:
count = int[7]
которые (в Java, C # и т. Д.) Подходят для подсчета целых чисел от 0 до 6.
foreach integer in input
count[i] = count[i] + 1
Это даст вам массив [1,1,2,0,1,1,1]
. Теперь вы можете сканировать этот массив (половину) и проверить, есть ли целые числа, которые складываются до i
, как
for j = 0 to count.length - 1
if count[j] != 0 and count[i - j] != 0 then // Check for array out-of-bounds here
WUHUU! the integers j and i - j adds up
В целом, этот алгоритм дает вам O(n + k)
, где n - результат сканирования по вводу длины n, а k - просмотр массива счетчиков длины k (целые числа от 0 до k - 1). Это означает, что если n > k
, то у вас есть гарантированное решение O(n)
.