Два указателя

описание группы задач
Обобщенное описание задания: дан массив элементов, необходимо найти в нем какую-то последовательность.

Идея решения: фиксирование первой позиции и поиск второй позиции последовательности справа, так чтобы элементы удовлетворяли условию задачи.
Задача
Найти максимальное число одинаковых подряд идущих символов в строке

def max_consecutive_elements(array_str: str) -> int:
    result: int = 0
    first_pointer: int = 0

    while first_pointer < len(array_str):
        second_pointer: int = first_pointer

        while second_pointer < len(array_str) \
            and array_str[second_pointer] == array_str[first_pointer]:
            second_pointer += 1
        result = max(result, second_pointer - first_pointer)
        first_pointer = second_pointer
        
    return result
Задача 2
Дан массив целых чисел arr и целое число X. Элементы в массиве отсортированы по возрастанию.
Определите, существует ли в массиве такой непрерывный подмассив, что сумма его элементов равна X

def subarray_sum(array: int, x: int) -> bool:
    right: int = 0
    current_sum: int = 0
    for left in range(len(array)):
        if left > 0:
            current_sum -= array[left - 1]
        while right < len(array) and current_sum < x:
            current_sum += array[right]
            right += 1
        if current_sum == x:
            return True
    return False
Задача 3
Дан массив целых чисел arr и целое число X. Элементы в массиве не отсортированы.
Определите, существует ли в массиве два элемента, что сумма их равна X

Данную задачу можно решить двумя способами:

1) С сортировкой элементов массива и перебором элементов
2) С использованием вспомогательной коллекции set().
вариант 1

def two_sum(arr: list, x: int) -> tuple:
    arr.sort()
    left: int = 0
    right: int = len(arr)-1
    while left <= right:
        current_sum = arr[left]+arr[right]
        if current_sum == x:
            return arr[left], arr[right]
        if current_sum <x:
            left += 1
        else:
            right -= 1
    return None, None

if __name__ == '__main__':
    array: int = [5, 7, 9, 12, 15, 18, 19, 20, 22]
    x: int = 27
    print(two_sum(array, x))
Вариант 2

def subarray_sum(array: int, x: int) -> bool:
    right: int = 0
    current_sum: int = 0
    for left in range(len(array)):
        if left > 0:
            current_sum -= array[left - 1]
        while right < len(array) and current_sum < x:
            current_sum += array[right]
            right += 1
        if current_sum == x:
            return True
    return False
Когда метод не применяется
Пример Задачи. Дан массив чисел arr и целое число X. Определите, существует ли в массиве такой непрерывный подмассив, что сумма его элементов равна X

Если элементы могут быть отрицательными и не расположены в порядке возрастания, тогда задачу не решить этим методом. Метод двух указателей работает, когда мы имеем дело с монотонными функциями.