Найти пару чисел, разность которых представляет собой входное значение "k" в несортированном массиве
Как упоминалось в названии, я хочу найти пары элементов с разницей K
example k=4 and a[]={7 ,6 23,19,10,11,9,3,15}
output should be :
7,11
7,3
6,10
19,23
15,19
15,11
Я прочитал предыдущие сообщения в SO "найти пару чисел в массиве, которые добавляют к заданной сумме"
Чтобы найти эффективное решение, сколько времени требуется? Является ли временная сложность O(nlogn)
или O(n)
?
Я попытался сделать это с помощью техники разделения и покорения, но я не понимаю подсказки о состоянии выхода...
Если эффективное решение включает сортировку входного массива и управление элементами с помощью двух указателей, то я думаю, что я должен взять минимум O(nlogn)
...
Существует ли какая-либо математическая техника, которая приносит решение в O(n)
. Любая помощь приветствуется.
Ответы
Ответ 1
Вы можете сделать это в O (n) с хеш-таблицей. Поместите все числа в хэш для O (n), а затем снова просмотрите их, ища number[i]+k
. Хэш-таблица возвращает "Да" или "Нет" в O (1), и вам нужно пройти все числа, поэтому общее число равно O (n). Любая структура набора с установкой O (1) и временем проверки O (1) будет работать вместо хеш-таблицы.
Ответ 2
Простым решением в O (n * Log (n)) является сортировка вашего массива, а затем переход через ваш массив с помощью этой функции:
void find_pairs(int n, int array[], int k)
{
int first = 0;
int second = 0;
while (second < n)
{
while (array[second] < array[first]+k)
second++;
if (array[second] == array[first]+k)
printf("%d, %d\n", array[first], array[second]);
first++;
}
}
Это решение не использует дополнительное пространство, в отличие от решения с хэш-таблицей.
Ответ 3
Можно сделать одну вещь, используя индексирование в O (n)
- Возьмите логический массив
arr
, индексированный в списке ввода.
- Для каждого целого
i
находится во входном списке, затем установите arr[i] = true
- Проведите весь
arr
от младшего целого до наивысшего целого числа следующим образом:
- всякий раз, когда вы находите
true
в i
-м индексе, запишите этот индекс.
- посмотрим, существует ли
arr[i+k]
. Если да, то i
и i+k
номера являются необходимой парой
- else продолжить со следующим целым числом
i+1