👉👈 Алгоритм двух указателей Алгоритм двух указателей – это метод оптимизированного перебора данных с использованием двух индексов, которые двигаются навстречу друг другу, в одном направлении или с разной скоростью.Как это работает Два указателя устанавливаются в разные точки структуры данных (например, на начало и конец массива). Они перемещаются в зависимости от условий задачи, например:• Навстречу друг другу — для поиска пар, например, в задачах на сумму двух чисел.• В одном направлении, но с разной скоростью — для удаления дубликатов или поиска подстроки. Процесс продолжается, пока указатели не пересекутся или не выполнится нужное условие.Виды двух указателей Два указателя навстречу друг другуПример: Проверка, является ли строка палиндромом.func isPalindrome(s string) bool { i, j := 0, len(s)-1 for i < j { if s[i] != s[j] { return false } i++ j-- } return true}1. Один указатель (i) начинает с начала, другой (j) – с конца строки.2. Если s[i] == s[j], двигаем оба указателя к центру.3. Если где-то символы не совпадают – это не палиндром. Два указателя в одном направленииПример: Удаление дубликатов из отсортированного массива.func removeDuplicates(nums []int) int { if len(nums) == 0 { return 0 } j := 0 for i := 1; i < len(nums); i++ { if nums[i] != nums[j] { j++ nums[j] = nums[i] } } return j + 1}1. Один указатель (i) двигается по массиву, второй (j) отслеживает уникальные элементы.2. Если встречаем новый элемент, перемещаем его вперед. Быстрый и медленный указателиПример: Нахождение цикла в связном списке (алгоритм Флойда).type ListNode struct { Val int Next *ListNode}func hasCycle(head *ListNode) bool { slow, fast := head, head for fast != nil && fast.Next != nil { slow = slow.Next fast = fast.Next.Next if slow == fast { return true } } return false}1. Медленный указатель движется по одному шагу, быстрый на два шага.2. Если fast догоняет slow, значит, есть цикл.3. Если fast достиг конца (nil), цикла нет.Алгоритм двух указателей – это оптимальный способ обработки массивов и списков, уменьшая сложность O(N²) → O(N). Канал Go-разработчика