есть массив int[100] целых чисел от 1 до 100 (могут быть дубли), перемешиваем, задача найти 2 числа, сумма которых составит 52, ну и как обычно надо пооптимальнее
0. Дано множество A, в котором 100 целых чисел в пределах от 1 до 100.
1. Создаем множество B на 51 элемент, в нем все нули. Первый элемент B[0].
2. Проходим по множеству A и увеличиваем соответствующее значение в B на 1. Таким образом мы будем знать, сколько каких чисел у нас есть. Значения 52 и выше опускаем.
4. Если B[25] > 1, то у нас не меньше 2 чисел 26 и давай до свидания.
5. Перебираем 25 пар B[0] + B[50], B[1] + B[49]... B[24] + B[26], если в обоих числах пары не нули, то мы нашли ответ.
Можно еще ускорить за счет дополнительной информации в B (если увеличили B[40], тут же выставить в B[10] "я очень жду сюда число" и когда будет увеличено B[10], сразу выдать ответ). Но спорно, все-таки дополнительные операции.
Пример.
A = [1, 45, 67, 22, 55, 89, 7, 26, 13, 17, 58]
B[0] = B[44] = B[21] = B[6] = B[25] = B[12] = B[16] = 1
B[25] меньше двух, не получилось
B[0] и B[50] не устраивают.
B[1] и B[49] не устраивают.
....
B[6] > 0 и B[44] > 0. Ура, товарищи, есть числа 7 и 45, они - ответ.
O(3N), наверное.