Изучение различных методов решения задачи двух сумм в Python

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

Метод 1: грубая сила
Подход грубой силы включает в себя проверку каждой пары чисел в массиве, чтобы увидеть, соответствует ли их сумма целевому значению. Хотя этот метод имеет временную сложность O(n^2), он обеспечивает простое решение проблемы.

def two_sum_brute_force(nums, target):
    for i in range(len(nums)):
        for j in range(i + 1, len(nums)):
            if nums[i] + nums[j] == target:
                return [i, j]
    return []

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

def two_sum_two_pointers(nums, target):
    left, right = 0, len(nums) - 1
    while left < right:
        current_sum = nums[left] + nums[right]
        if current_sum == target:
            return [left, right]
        elif current_sum < target:
            left += 1
        else:
            right -= 1
    return []

Метод 3: хеш-карта
Использование хеш-карты позволяет нам решить задачу двух сумм с линейной временной сложностью (O(n)). Мы сохраняем разницу между целью и каждым числом в массиве как ключи на карте, а их индексы — как значения. Обходя массив, мы проверяем, существует ли текущий номер на карте.

def two_sum_hash_map(nums, target):
    num_map = {}
    for i, num in enumerate(nums):
        complement = target - num
        if complement in num_map:
            return [num_map[complement], i]
        num_map[num] = i
    return []

Метод 4: сортировка и двоичный поиск
Этот метод включает в себя сортировку массива и выполнение двоичного поиска в отсортированном массиве. Сравнивая сумму текущей пары с целевой, мы можем соответствующим образом настроить диапазон поиска.

import bisect
def two_sum_binary_search(nums, target):
    sorted_nums = sorted(nums)
    for i, num in enumerate(sorted_nums):
        complement = target - num
        j = bisect.bisect_left(sorted_nums, complement, i + 1)
        if j < len(sorted_nums) and sorted_nums[j] == complement:
            return [nums.index(num), nums.index(complement)]
    return []

В этой статье мы рассмотрели несколько методов решения проблемы двух сумм в Python. Мы обсудили метод грубой силы, метод двух указателей, метод хеш-карты, а также метод сортировки и двоичного поиска. Каждый метод имеет свои преимущества и недостатки с точки зрения временной и пространственной сложности. Понимая эти методы, вы сможете с уверенностью решать аналогичные проблемы и выбирать наиболее подходящее решение для ваших конкретных требований.