---
round: 2
ticket_no: 2
source_no: 8
slug: two-sum
topic: Hash Table
difficulty: Easy
leetcode_id: 1
attempted: true
score: 2
verdict: partial
reviewed_at: 2026-09-12
---

# Билет 2 — Two Sum

## Условие (как предъявлено)

Дан массив целых чисел `nums` и целое число `target`. Вернуть **индексы** двух чисел, которые в сумме дают `target`. Гарантируется, что решение ровно одно, и нельзя использовать один и тот же элемент дважды.

```
Input:  nums = [2, 7, 11, 15], target = 9   →  Output: [0, 1]
Input:  nums = [3, 2, 4],       target = 6   →  Output: [1, 2]
Input:  nums = [3, 3],          target = 6   →  Output: [0, 1]
```

Ограничения: длина массива от 2 до 10^4, значения элементов и `target` в диапазоне ±10^9.

## Ответ

> Тут решение достигается в один проход. То есть у нас создаётся специальный массив, в котором, вернее, хэш-меп, в котором мы складываем элементы, которые мы уже видели. Вот есть, например, у нас есть первый элемент. Вот, ну, например, он двойка. Мы видим, что нам до девяти не хватает семь. То есть рассчитываем размер комплемента и ищем в хэш-мепе собственный элемент семерку. Если она там была, то мы её оттуда берём, индекс берём. Вот. Если мы не нашли там нужного, то мы текущий элемент добавляем в этот хэш-меп, если его там ещё до этого не было. То есть там получается, просто хранится ключ — это само число, а значение — это индекс. Вот. Таким образом мы проходимся по всем элементам. Если есть текущий элемен, смотрим, смотрим, сколько ему не хватает и пытаемся найти этот элемент в хэш-мепе.

## Разбор

**Что верно:** Один проход + хэш-таблица «число → индекс». Ключевой приём (провален в раунде 1 из-за самосовпадения) теперь проговаривается явно: сначала ищем комплемент среди уже виденных, и только если не нашли — добавляем текущий элемент. Это гарантирует, что элемент не спаривается сам с собой (`[3,2,4], target=6` даёт `[1,2]`, а не `[0,0]`).

**Что упущено и ошибки:** Не названа сложность по времени и памяти. Не названы граничные случаи (дубликаты `[3,3]`, отрицательные числа, пустой/одиночный массив). Мелкая оговорка «добавляем, если его ещё не было» — на практике индекс обновляется либо неважен, т.к. при дубликате ответ уже найден.

**Эталонная идея:** один проход, `seen[num] = i`; для текущего `num` вычисляем `complement = target - num` и ищем `seen.key?(complement)` до вставки текущего.

**Сложность:** время O(n), память O(n).

**Критерии:** идея ✅ · структура данных ✅ · сложность ❌ · граничные случаи ❌

**Разбор задачи:** [`../../algo-solutions/01-must-have/02-hash-table/08-two-sum.md`](../../algo-solutions/01-must-have/02-hash-table/08-two-sum.md)
