Два указателя на Python: как решать + 13 задач с проверкой
«Два указателя» (или *two pointers*) — это способ решать задачи про массивы и строки, где нужно что-то найти/посчитать для отрезков или пар элементов, не перебирая всё квадратично. Он часто встречается в задачах про «максимальный подряд идущий участок по ограничению» (как про бюджет на обеды), про подсчёт пар с условием разности/суммы, про слияние двух отсортированных списков (логов двух роботов), про поиск «слишком близких» значений.
Как распознать задачу под два указателя:
- В условии есть «подряд», «отрезок», «подстрока», «окно» и просят максимум/минимум длины или число подходящих отрезков.
- Ограничение монотонное: если расширять отрезок вправо, значение (сумма, число плохих элементов, количество разных) меняется предсказуемо, и можно «исправить» ситуацию сдвигом левой границы.
- Часто отдельно сказано, что числа неотрицательные (тогда сумма окна только растёт при движении правого указателя).
- Либо даны два отсортированных массива/указатели по времени — и нужно пройти их «встык».
Суть приёма: держим два индекса l и r, которые задают текущий отрезок, и поддерживаем его характеристику (например, сумму). Двигаем r вперёд, пока можно, а когда условие нарушено — двигаем l, пока снова не станет хорошо. Так каждый индекс проходит массив максимум один раз, и вместо O(n^2) получается O(n).
С чего начать учиться:
- Отработать «скользящее окно» на неотрицательных числах: максимум длины при сумме не больше
k. - Научиться поддерживать инвариант: что именно всегда верно про текущий отрезок.
- Потренироваться на двух отсортированных массивах: слияние, подсчёт пар, поиск ближайших.
- Всегда проверять типы: суммы и ответы часто требуют 64-битные значения.
Ниже — задачи с автопроверкой и разбором подхода: начни с простых окон, затем переходи к парам и слиянию.
Задачи по теме «Два указателя»
- Кого вызовут k‑м — средний
- Полоса концентрации — средний
- Дневник: самая длинная неделя с K предметами — продвинутый
- Тройной перекус — продвинутый
- Тихая улица по датчикам — продвинутый
- Совпали по шагам — продвинутый
- Самая короткая «сытая» серия перекусов — продвинутый
- Полоска перекусов — средний
- Пары очков в аркаде — средний
- Склейка журналов двух роботов — базовый
- Слишком близкие результаты — средний
- Сдача без мелочи — базовый
- Серия обедов по бюджету — средний
Смежные темы
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- БВИ по олимпиадам: в какие вузы берут — правила приёма вузов, разобранные построчно, со ссылкой на приказ у каждой строки
- Перечневые олимпиады: что это и что дают — весь перечень Минобрнауки: уровни, срок диплома, разрезы по предметам и классам