Дан массив из n целых чисел и задано число X. Найдите все уникальные пары элементов (a, b), сумма которых равна X.
Следующее - мое решение, это O (nLog (n) + n), но я не уверен, оптимально оно или нет.
int main(void)
{
int arr [10] = {1,2,3,4,5,6,7,8,9,0};
findpair(arr, 10, 7);
}
void findpair(int arr[], int len, int sum)
{
std::sort(arr, arr+len);
int i = 0;
int j = len -1;
while( i < j){
while((arr[i] + arr[j]) <= sum && i < j)
{
if((arr[i] + arr[j]) == sum)
cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
i++;
}
j--;
while((arr[i] + arr[j]) >= sum && i < j)
{
if((arr[i] + arr[j]) == sum)
cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
j--;
}
}
}
while((arr[i] + arr[j]) <= sum && i < j)
должно бытьwhile( i < J && arr[i] + arr[j] <= sum )
. (аналогично для второго подцикла)Ответы:
источник
arr=[1,2,1,2,1,2,1,...]
. Что касается уникальности по значению, похоже, что другая хеш-таблица с ключом парой значений поможет. По-прежнему хороший, компактный и элегантный ответ. +1hash(K - arr[i]) != i
то проверяет и наличие, и отсутствие совпадения? Ожидаю, что там будет отдельная проверка на присутствие.Есть 3 подхода к этому решению:
пусть сумма равна T, а n - размер массива.
Подход 1.
Наивный способ сделать это - проверить все комбинации (n выберите 2). Этот исчерпывающий поиск составляет O (n 2 ).
Подход 2:
лучший способ - отсортировать массив. Это занимает O (n log n).
Затем для каждого x в массиве A используйте двоичный поиск для поиска Tx. Это займет O (nlogn).
Итак, общий поиск - O (n log n).
Подход 3.
Лучшим способом было бы вставить каждый элемент в хеш-таблицу (без сортировки). Это занимает O (n) как постоянную вставку времени.
Затем для каждого x мы можем просто найти его дополнение Tx, которое равно O (1).
В целом время выполнения этого подхода составляет O (n).
Вы можете сослаться на больше здесь. Спасибо.
источник
Реализация на Java: использование алгоритма codaddict (возможно, немного отличается)
Для input =
{2,45,7,3,5,1,8,9}
и если Sum10
Выходные пары:
Некоторые примечания к решению:
источник
put(k-input[i], input[i])
(codaddicts помещает индекс как полезное значение.) То, что вы написали, можно упростить доfor (i:input){ if (intSet.contains(sum-i) { print(i + "," + (sum-i) ); } else {intSet.add(i)}
Решение в java. Вы можете добавить все элементы String в ArrayList строк и вернуть список. Вот распечатываю.
источник
Реализация Python:
Вывод:
источник
C ++ 11, сложность времени выполнения O (n):
источник
Вот решение, которое учитывает повторяющиеся записи. Он написан на javascript и предполагает, что массив отсортирован. Решение выполняется за время O (n) и не использует дополнительную память, кроме переменной.
Я решил это во время интервью для крупной корпорации. Забрали, но не меня. Итак, вот оно для всех.
Начните с обеих сторон массива и медленно продвигайтесь внутрь, не забывая подсчитывать дубликаты, если они существуют.
Он учитывает только пары, но может быть переработан в
Наслаждайтесь!
источник
if(distI > distK) while(_arr[++i]==curI); else while(_arr[--k]==curK);
На)
Методология: a + b = c, поэтому вместо поиска (a, b) мы ищем a = c - b
источник
Реализация на Java: Использование алгоритма codaddict:
Вывод:
Если вам нужны повторяющиеся пары (например: 80,80), просто удалите && (Integer) mapping.get (ka [i])! = I из условия if, и все готово.
источник
Только что посетил этот вопрос на HackerRank, и вот мое решение для цели C :
Надеюсь, это кому-то поможет.
источник
это реализация O (n * lg n) с использованием реализации двоичного поиска внутри цикла.
источник
В питоне
источник
Хорошее решение от Codeaddict. Я взял на себя смелость реализовать его версию на Ruby:
Чтобы разрешить дублирование пар (1,5), (5,1), нам просто нужно удалить
&& !result[sum-l]
инструкциюисточник
Вот код Java для трех подходов:
1. Используя Map O (n), здесь также можно использовать HashSet.
2. Отсортируйте массив, а затем используйте BinarySearch для поиска дополнения O (nLog (n))
3. Традиционный двойной цикл BruteForce O (n ^ 2)
источник
Простая программа на java для массивов с уникальными элементами:
источник
Простой фрагмент кода Java для печати пар ниже:
источник
Другое решение в Swift: идея состоит в том, чтобы создать хэш, в котором хранятся значения (sum - currentValue), и сравнивать их с текущим значением цикла. Сложность - O (n).
источник
Мое решение - Java - без дубликатов
источник
Это печатает пары и избегает дублирования с помощью побитовых манипуляций.
источник
Я обошел стороной обработку битов и просто сравнил значения индексов. Это меньше, чем значение итерации цикла (в данном случае i). Это также не будет печатать повторяющиеся пары и повторяющиеся элементы массива.
источник
в C #:
источник
Одно из решений может быть таким, но не оптимальным (сложность этого кода - O (n ^ 2)):
источник
Простая версия кода для Python, которая находит нулевую парную сумму и может быть изменена для нахождения k:
Сложность выполнения функции равна O (n) и Space: O (n).
источник
источник
меньше чем o (n) решение будет =>
источник
Решение на Python с использованием понимания списков
О (N 2 )
также дает две упорядоченные пары - (a, b) и (b, a), а также
источник
I am not sure … Thanks for comments
). Вы можете обозначить удар по сложности ближе к O (n²).Я могу сделать это за O (n). Дай мне знать, когда захочешь получить ответ. Обратите внимание, что он включает в себя простой однократный обход массива без сортировки и т. Д. Я также должен упомянуть, что он использует коммутативность сложения и не использует хеши, но тратит впустую память.
используя Систему; using System.Collections.Generic;
/ * Существует подход O (n) с использованием таблицы поиска. Подход состоит в том, чтобы сохранить значение в «бункере», который можно легко найти (например, O (1)), если оно является кандидатом на соответствующую сумму.
например,
для каждого a [k] в массиве мы просто помещаем его в другой массив в позицию x - a [k].
Предположим, что у нас есть [0, 1, 5, 3, 6, 9, 8, 7] и x = 9
Создаем новый массив,
значение индексов
ТОГДА важны только те значения, которые имеют индекс в новой таблице.
Итак, скажем, когда мы достигаем 9 или равного числа, мы видим, имеет ли наш новый массив индекс 9-9 = 0. Поскольку он знает, что все содержащиеся в нем значения прибавятся к 9. (обратите внимание, что в этом случае очевидно, что есть только 1 возможный, но в нем может быть несколько значений индекса, которые нам нужно сохранить).
Таким образом, фактически нам нужно всего лишь один раз пройти через массив. Поскольку сложение коммутативно, мы получим все возможные результаты.
Например, когда мы дойдем до 6, мы получим индекс в нашей новой таблице как 9 - 6 = 3. Поскольку таблица содержит это значение индекса, мы знаем значения.
По сути, это обмен скорости на память. * /
источник
Решение Javascript:
источник
https://github.com/clockzhong/findSumPairNumber
Я сделал это при стоимости сложности O (m + n) как для времени, так и для объема памяти. Я подозреваю, что это лучший алгоритм на данный момент.
источник
int [] arr = {1,2,3,4,5,6,7,8,9,0};
var z = (из a в arr из b в arr, где 10 - a == b выберите новый {a, b}). ToList;
источник