Поиск пары элементов
Поиск пары элементов — это задача нахождения двух разных элементов массива, для которых выполняется заданное условие: например, сумма равна числу \(S\), один элемент больше другого или значения совпадают.
Проще всего решить задачу с помощью перебора массива. Внешний цикл выбирает первый элемент, а внутренний — второй элемент, расположенный правее него. Так каждая пара индексов проверяется ровно один раз, и пара элемента с самим собой не рассматривается.
При таком подходе число проверок равно \(\frac{n(n-1)}{2}\), поэтому временная сложность составляет \(O(n^2)\), а дополнительная память — \(O(1)\). Если массив отсортирован или допускается хранить уже встреченные значения, поиск иногда можно ускорить до \(O(n)\) или \(O(n\log n)\). Такой приём связан с методом двух указателей.
Для массива \([4, 7, 1, 9]\) и \(S=10\) перебираем пары: \(4+7=11\), \(4+1=5\), \(4+9=13\), \(7+1=8\), \(7+9=16\), \(1+9=10\). Подходящая пара — элементы \(1\) и \(9\), находящиеся на индексах 2 и 3.
for i от 0 до n - 2: for j от i + 1 до n - 1: if условие(a[i], a[j]): обработать пару i, j
Пара состоит ровно из двух элементов. Если условие должно выполняться для трёх элементов, нужен отдельный алгоритм поиска тройки элементов. Также нельзя считать одну и ту же пару дважды: пары \((i,j)\) и \((j,i)\) одинаковы.
Какие индексы нужно выбирать во внутреннем цикле, если первый индекс равен \(i\)?
Главное
- Пара элементов использует два разных индекса и удовлетворяет условию задачи.
- Полный перебор с индексами \(j>i\) проверяет каждую пару ровно один раз и работает за \(O(n^2)\).
- Для ускорения могут применяться сортировка или два указателя.