нужно найти такие пары индексов j > i: A[j] - A[i] = j - i за линейную сложность, используя хеширование
Если надо найти все, то либо квадрат (так как для массива 1,2,3,4,...,n будет n*(n-1)/2 пар). Либо переопределить лист) В начале arr.groupByIndexed{idx,val->val-idx to idx}. Потом переопределить лист) Тогда можно лист сделать за линию. Возвращать по индексу из него за logn
Так за n же решается
если ограничения на A[i] в рамках 1e6 то можно хеш функцию даже не делать а определить пустой массив размером в максимальный A{I}
За 1 проход по массиву: превращаем каждое его значение в хэш таблицу где ключ это A[i]-i, а значение - динамический массив из i. Если ещё где то будет такая же разность - получаем сразу доступ к ячейке с нужными элементами и выводим пары текущего индекса с теми что внутри уже есть. А в конец потом ещё i допишем
Все пары - это квадрат
Все проверки это квадрат. Но можно сделать не все проверки)
А найти все равные все ещё за n
Да, так работает, спасибо. Только нужно итоговое количество пар разделить пополам, чтобы одни и те же пары не учитывать дважды.
Неа. Я сформулировал довольно четко: выводим пары текущего индекса с теми что уже доступны по ключу
Обсуждают сегодня