Python Glossary English

все Python 3Алгоритмы и структуры данныхфункция

Два указателя (two pointers)

техники

Два индекса движутся навстречу друг другу или в одном направлении. O(n) для задач на отсортированных массивах.

Синтаксис

lo, hi = 0, len(arr)-1
while lo < hi: ...

Сходящаяся пара указателей корректна только на отсортированных данных — на произвольном списке она молча вернёт неверный ответ. Сортировать самому значит заплатить O(n log n) и потерять исходные позиции, поэтому в задачах, где нужны именно индексы, обычно выигрывает словарь за один проход. И следите за границей цикла: while lo < hi не даёт сложить элемент сам с собой, а lo <= hi это разрешает.

Примеры

# Сумма двух чисел в отсортированном массиве
def two_sum_sorted(arr, target):
    lo, hi = 0, len(arr)-1
    while lo < hi:
        s = arr[lo] + arr[hi]
        if s == target: return (lo, hi)
        elif s < target: lo += 1
        else: hi -= 1
    return None
print(two_sum_sorted([1,2,3,4,6], 6))  # → (1, 3) (это 2+4)
# Проверка палиндрома
def is_palindrome(s):
    lo, hi = 0, len(s)-1
    while lo < hi:
        if s[lo] != s[hi]: return False
        lo += 1; hi -= 1
    return True
print(is_palindrome('racecar'))  # → True
print(is_palindrome('hello'))    # → False
# Удаление дубликатов in-place
def remove_dups(arr):
    if not arr: return 0
    slow = 0
    for fast in range(1, len(arr)):
        if arr[fast] != arr[slow]:
            slow += 1
            arr[slow] = arr[fast]
    return slow + 1
arr = [1,1,2,3,3,4]
k = remove_dups(arr)
print(arr[:k])  # → [1,2,3,4]
# Слияние двух отсортированных массивов
def merge_sorted(a, b):
    i = j = 0; result = []
    while i < len(a) and j < len(b):
        if a[i] <= b[j]: result.append(a[i]); i+=1
        else: result.append(b[j]); j+=1
    result.extend(a[i:]); result.extend(b[j:])
    return result
print(merge_sorted([1,3,5],[2,4,6]))  # → [1,2,3,4,5,6]
# Контейнер с наибольшим объёмом
def max_area(heights):
    lo, hi = 0, len(heights)-1
    best = 0
    while lo < hi:
        area = (hi-lo) * min(heights[lo],heights[hi])
        best = max(best, area)
        if heights[lo] < heights[hi]: lo+=1
        else: hi-=1
    return best
print(max_area([1,8,6,2,5,4,8,3,7]))  # → 49

См. также

Частые ошибки

Открыть в полном глоссарииdocs.python.orgСообщить о неточности