Two Sum
Условие
Дан массив целых чисел nums и целое число target. Верните индексы двух чисел, сумма которых равна target.
Можно предположить, что каждый вход имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды.
Сигнатура
func twoSum(nums []int, target int) []int
Примеры
Вход: nums = []int{2, 7, 11, 15}, target = 9
Выход: []int{0, 1} (потому что nums[0] + nums[1] = 2 + 7 = 9)
Вход: nums = []int{3, 2, 4}, target = 6
Выход: []int{1, 2}
Дополнительно
Постарайтесь решить за O(n) по времени, используя хеш-таблицу.
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение Two Sum
Описание задачи
Задача требует найти два индекса элементов массива, сумма которых равна целевому значению. Ограничения: каждый элемент можно использовать только один раз, и решение существует всегда.
Подход с хеш-таблицей (O(n) по времени)
Оптимальное решение использует хеш-таблицу (map в Go) для хранения пройденных чисел и их индексов. Идея простая:
- Проходим по массиву один раз
- Для каждого элемента проверяем, есть ли уже в map число, которое дополнит текущий элемент до target
- Если есть — возвращаем индексы
- Если нет — добавляем текущее число в map и продолжаем
Время: O(n) — один проход по массиву. Пространство: O(n) — размер map в худшем случае.
Реализация
func twoSum(nums []int, target int) []int {
seen := make(map[int]int)
for i, num := range nums {
complement := target - num
if j, exists := seen[complement]; exists {
return []int{j, i}
}
seen[num] = i
}
return []int{}
}
Пример работы
Дан массив nums = [2, 7, 11, 15], target = 9:
- i=0, num=2: complement = 7. В map пусто. Добавляем: {2: 0}
- i=1, num=7: complement = 2. В map есть 2 → индекс 0! Возвращаем [0, 1]
Дан массив nums = [3, 2, 4], target = 6:
- i=0, num=3: complement = 3. В map пусто. Добавляем: {3: 0}
- i=1, num=2: complement = 4. В map пусто. Добавляем: {3: 0, 2: 1}
- i=2, num=4: complement = 2. В map есть 2 → индекс 1! Возвращаем [1, 2]
Ключевые моменты
- Map в Go: быстрый поиск O(1) в среднем
- Однопроходной алгоритм: экономит память и время
- Порядок индексов: первый индекс меньше второго (автоматически)
- Сложность: Time O(n), Space O(n)
Это классическая задача, часто встречается в интервью.