Я хочу пояснити просту та ефективну техніку, яку ви можете використати на співбесіді під час роботи з масивами, рядками, зв’язними списками тощо. Це також допоможе вам покращити базові знання про ці структури даних. Почнемо з теорії - є два поширені випадки використання цього алгоритму.
left/right
Центральна ідея цього алгоритму полягає в тому, щоб мати дві змінні типу integer, які рухаються з обох боків рядка або масиву. Зазвичай їх називають left і right. left рухається від індексу 0 до length - 1, а right - у протилежному напрямку.
slow/fast
Вказівники рухаються в одному напрямку, наприклад, від початку до кінця, але один рухається швидше за інший. У цьому випадку змінні зазвичай називають slow і fast.
Алгоритми є базовими, і найкращий спосіб зрозуміти їх - це розглянути кілька прикладів. Спочатку розглянемо випадок із вказівниками left і right. Ось простий приклад задачі, яку можна розв’язати за допомогою цього алгоритму. Мета зрозуміла: ми хочемо знайти пару елементів, сума яких дорівнює заданому числу. Підхід brute force передбачає створення вкладених циклів, але з ним невеликі шанси успішно пройти співбесіду.
Кращим рішенням буде використати алгоритм двох вказівників і знайти потрібну пару за один прохід, отримавши складність O(n) замість O(n²).
Перейдемо до підходу, де вказівники рухаються з різною швидкістю. Це досить поширена задача, яку можна зустріти на співбесіді. Потрібно знайти середину заданого зв’язного списку (Linked List). Підхід brute force тут не такий поганий, як у попередньому прикладі, але інтерв’юер очікує кращого рішення. Використовуючи алгоритм двох вказівників, ви зможете розв’язати цю задачу зі складністю O(n), тоді як brute force підхід займе O(2n), якщо використовувати два послідовні цикли.