Пример решения задачи #1 на Python LeetCode — Сумма двух

Опубликовано: 29.11.2024, 22:11 | Автор: hdhAI

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

Условие задачи:
Учитывая массив целых чисел nums и целочисленную цель, верните индексы двух чисел так, чтобы их сумма составляла целевое значение.

Решение:


Python


class Solution(object):
    def twoSum(self, nums, target):
        """
        Находит индексы двух чисел в массиве, сумма которых равна целевому значению.

        Args:
            nums: Список целых чисел.
            target: Целевое значение суммы.

        Returns:
            Список из двух индексов, если решение найдено.
            Пустой список, если решение не найдено.
        """

        # Создаем словарь для хранения уже встречавшихся чисел и их индексов.
        seen = {}
        for i, num in enumerate(nums):
            # Вычисляем число, которое нужно добавить к текущему, чтобы получить целевое значение.
            complement = target - num

            # Проверяем, есть ли уже такое число в словаре.
            if complement in seen:
                # Если есть, возвращаем индексы найденных чисел.
                return [seen[complement], i]

            # Добавляем текущее число и его индекс в словарь.
            seen[num] = i

        # Если решение не найдено после проверки всех чисел, возвращаем пустой список.
        return []

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

Класс Solution и метод twoSum

class Solution(object): Определяет класс Solution, который будет содержать нашу функцию для решения задачи.
def twoSum(self, nums, target): Определяет метод twoSum внутри класса Solution. Этот метод принимает на вход:
nums: список целых чисел, в котором мы будем искать нужные элементы.
target: целевое значение, сумму которого мы хотим найти.

Создание словаря seen
seen = {}: Создается пустой словарь seen. Этот словарь будет использоваться для хранения информации о том, какие числа мы уже встречали и на каких индексах они находятся.

Цикл по массиву nums
for i, num in enumerate(nums): Начинается цикл, который проходит по каждому элементу списка nums. Переменная i будет хранить индекс текущего элемента, а num будет хранить само значение элемента.

Вычисление комплемента
complement = target - num: Вычисляется значение complement, которое нужно добавить к текущему числу num, чтобы получить целевое значение target. Например, если target равен 9, а текущее число num равно 7, то complement будет равен 2.

Проверка наличия комплемента в словаре
if complement in seen: Проверяется, есть ли уже вычисленное значение complement в словаре seen. Если такое значение есть, значит мы нашли два числа в массиве, сумма которых равна target.

Возврат индексов
return [seen[complement], i]: Если complement найден в словаре, то возвращается список из двух индексов:
seen[complement] - индекс числа, которое мы нашли в словаре и которое является комплементом текущего числа.
i - индекс текущего числа.

Добавление числа в словарь
seen[num] = i: Если complement не найден в словаре, то текущее число num и его индекс i добавляются в словарь seen. Это делается для того, чтобы при последующих итерациях цикла мы могли быстро проверить, встречалось ли уже такое число.

Возврат пустого списка
return []: Если цикл завершился, а решение так и не было найдено, то возвращается пустой список, что означает, что в массиве нет двух чисел, сумма которых равна target.

Общая идея алгоритма
Создается пустой словарь для хранения уже встречавшихся чисел и их индексов.
Проходится по каждому числу в массиве.
Вычисляется число, которое нужно добавить к текущему, чтобы получить целевое значение.
Проверяется, есть ли это число в словаре. Если есть, то найдены два числа с нужной суммой, и их индексы возвращаются.
Если числа нет в словаре, то текущее число добавляется в словарь вместе с его индексом.
Если после проверки всех чисел решение не найдено, возвращается пустой список.
Преимущества использования словаря:

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

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

Похожие статьи
Интересное





Warning: file_put_contents(/var/www/angella1/data/www/hdhai.com/counter/count.php): Failed to open stream: Permission denied in /var/www/angella1/data/www/hdhai.com/counter.php on line 89