---
title: Summary Ranges
difficulty: Easy
category: Two Pointers
leetcode_id: 228
revision_count: 1
last_revision: 2026-09-12
---

# Summary Ranges

> **LeetCode:** [#228](https://leetcode.com/problems/summary-ranges/)
> **Сложность:** Easy
> **Категория:** Two Pointers

## Условие

Дан отсортированный уникальный массив целых чисел `nums`. Вернуть массив строк — кратчайшие отсортированные диапазоны, покрывающие все числа.

```
Input:  nums = [0,1,2,4,5,7]    →  Output: ["0->2","4->5","7"]
Input:  nums = [0,2,3,4,6,8,9]  →  Output: ["0","2->4","6","8->9"]
```

## Ключевая идея

Один указатель `i` пробегает массив, второй — неявный `start` фиксирует начало текущего диапазона. Пока следующий элемент последователен (`nums[i+1] == nums[i] + 1`), двигаем `i`. Как только последовательность прервалась — формируем строку диапазона и начинаем новый.

## Оценка сложности

- **Время:** O(n) — один проход по массиву
- **Память:** O(1) — без учёта массива результата

## Решение (Ruby)

```ruby
# @param {Integer[]} nums
# @return {String[]}
def summary_ranges(nums)
  result = []
  i = 0

  while i < nums.length
    start = nums[i]

    while i + 1 < nums.length && nums[i + 1] == nums[i] + 1
      i += 1
    end

    if start == nums[i]
      result << "#{start}"
    else
      result << "#{start}->#{nums[i]}"
    end

    i += 1
  end

  result
end
```

## Разбор на примере

```
Input: nums = [0,1,2,4,5,7]

i=0: start=0, внутренний while: 1==1→i=1, 2==2→i=2, 3≠4→стоп
     start=0, nums[2]=2 → "0->2", result = ["0->2"], i=3

i=3: start=4, внутренний while: 5==5→i=4, 6≠7→стоп
     start=4, nums[4]=5 → "4->5", result = ["0->2","4->5"], i=5

i=5: start=7, внутренний while: выход за границу
     start=7, nums[5]=7 → "7", result = ["0->2","4->5","7"], i=6

Result: ["0->2", "4->5", "7"]
```

## Edge Cases

- **Пустой массив**: `nums = []` → `[]` — while не выполняется, result пустой.
- **Один элемент**: `nums = [5]` → `["5"]` — start == nums[i], одиночный диапазон.
- **Все элементы последовательны**: `nums = [1,2,3]` → `["1->3"]` — один диапазон.
- **Ни одного последовательного**: `nums = [1,3,5,7]` → `["1","3","5","7"]` — каждый элемент сам за себя.
- **Отрицательные числа**: `nums = [-3,-2,-1,1,2]` → `["-3->-1","1->2"]` — работает без изменений.

## Типичные ошибки

1. ❌ **Пропуск последнего элемента** — после внутреннего while надо увеличить `i`, иначе бесконечный цикл.
2. ❌ **Сравнение `nums[i+1] == nums[i]` вместо `nums[i+1] == nums[i] + 1`** — проверка на равенство, а не последовательность.
3. ❌ **Забыть про single-элементный диапазон** — если `start == nums[i]`, выводим только число, без стрелки.

## Альтернативные подходы

| Подход | Время | Память | Комментарий |
|--------|-------|--------|-------------|
| **One-pointer with while loop** | **O(n)** | **O(1)** | **финальное решение — один проход, без двух явных указателей** |

Задача проще, чем классические two pointers с двумя индексами: достаточно одного `i`, `start` хранит начало диапазона. По сути — линейный скан с захватом последовательных групп.

## Заметки после повторения

_— Заполняется после каждой тренировки._