Новости IT, лайфхаки & кодинг

Пример решения задачи #16. Python LeetCode, 3Sum Closest

Опубликовано: 13.04.2025, 17:07 | Автор: hdhAI

Вариант решения задачи на языке программирования Python с LeetCode.
Категория: Алгоритмы.
Название задачи: 3Sum Closest.
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
Дан массив целых чисел nums длины n и целое число target. Найдите три числа в массиве nums, сумма которых наиболее близка к target. Верните сумму этих трех чисел. Можно предположить, что для каждого входного набора существует ровно одно решение.

Решение:


Python

class Solution(object):
    def threeSumClosest(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        # Сначала сортируем массив для удобства поиска
        nums.sort()  # Сортировка позволяет использовать метод двух указателей
        
        # Инициализируем переменную для хранения ближайшей суммы
        closest_sum = float('inf')  # Бесконечность как начальное значение
        
        # Проходим по каждому элементу массива, рассматривая его как первый элемент тройки
        for i in range(len(nums) - 2):  # До len(nums) - 2, так как нужны еще два элемента
            left, right = i + 1, len(nums) - 1  # Указатели на два других элемента
            
            while left < right:  # Пока указатели не встретились
                current_sum = nums[i] + nums[left] + nums[right]  # Текущая сумма трех элементов
                
                # Если текущая сумма ближе к цели, чем предыдущая ближайшая сумма, обновляем её
                if abs(current_sum - target) < abs(closest_sum - target):
                    closest_sum = current_sum
                
                # Двигаем указатели в зависимости от того, больше или меньше текущая сумма цели
                if current_sum < target:
                    left += 1  # Увеличиваем левый указатель, чтобы увеличить сумму
                elif current_sum > target:
                    right -= 1  # Уменьшаем правый указатель, чтобы уменьшить сумму
                else:
                    # Если текущая сумма равна цели, возвращаем её сразу (она оптимальна)
                    return current_sum
        
        # Возвращаем ближайшую сумму после завершения цикла
        return closest_sum


Объяснение кода

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

Инициализация переменной closest_sum:
Переменная closest_sum используется для хранения текущей ближайшей суммы к целевому значению target. Начальное значение задается как бесконечность (float('inf')), чтобы любая реальная сумма была ближе к цели.

Основной цикл:
Мы проходим по каждому элементу массива, рассматривая его как первый элемент тройки. Для каждого такого элемента мы используем два указателя (left и right) для поиска двух других элементов.

Метод двух указателей:
Указатель left начинается сразу после текущего элемента i, а указатель right начинается с конца массива.


Мы вычисляем текущую сумму трех элементов (current_sum) и проверяем, насколько она близка к целевому значению target.


Если текущая сумма ближе к цели, чем ранее найденная ближайшая сумма, мы обновляем closest_sum.

Движение указателей:
Если текущая сумма меньше цели, мы увеличиваем левый указатель (left += 1), чтобы увеличить сумму.


Если текущая сумма больше цели, мы уменьшаем правый указатель (right -= 1), чтобы уменьшить сумму.


Если текущая сумма равна цели, мы немедленно возвращаем её, так как это оптимальное решение.

Возврат результата:
После завершения всех итераций возвращается значение closest_sum, которое представляет собой сумму трех чисел, наиболее близкую к целевому значению.

Пример работы программы:

Входные данные:
nums = [-1, 2, 1, -4]
target = 1

Выходные данные: 2

Источник решения: hdhai.com