(Вопрос в его нынешней форме немного сбивает с толку - мой ответ предполагает, что вопрос состоит в том, чтобы найти два числа в массиве, которые суммируются с данным значением)
Поскольку данный массив не отсортирован, я предполагаю, что нам не разрешено сортировать массив (т. Е. Данный порядок массива изменить нельзя).
Самое простое решение IMHO - перебирать каждое число x
и проверять, встречается ли I-x
где-либо в массивах. По сути, это то, что делает ваше решение O (n ^ 2).
Это может быть уменьшено до O (n) или O (nlogn) путем ускорения поиска с использованием некоторой структуры данных с быстрой установкой. По сути, когда мы выполняем итерацию по массиву, мы запрашиваем, происходит ли в наборе I-x
.
Код (на Python):
l=[1,2,3,4,5,6,7,8,9]
seen=set()
I=11
for item in l:
if I-item in seen:
print "(%d,%d)"%(item,I-item)
seen.add(item)
Сложность решения зависит от сложности вставки / поиска используемой вами структуры данных set
. Реализация на основе хеш-таблицы имеет сложность O (1), поэтому она дает вам алгоритм O (n), в то время как set
на основе дерева приводит к алгоритму O (nlogn).
Edit:
Эквивалентная структура данных для set
Python будет stl::set
в C ++ и TreeSet
/ HashSet
в Java. Строка I-x in seen
будет переводиться в seen.contains(I-x)
в Java и seen.find(I-x)==seen.end()
в C ++.