Два указателя

Контейнер с водой

Найти две линии, которые вместе с осью X удерживают больше всего воды

Средний

Постановка задачи

Описание (LeetCode)

Дан массив целых чисел height длины n. Каждый элемент height[i] задает высоту вертикальной линии, проведенной в точке i.

Нужно выбрать две линии так, чтобы вместе с осью X они образовали контейнер, который может удержать как можно больше воды. Верните максимальный объем воды, который может удержать такой контейнер.

Контейнер нельзя наклонять.

Пример 1:

Контейнер с водой

height = [1, 8, 6, 2, 5, 4, 8, 3, 7]

Результат:

49

Пояснение:

Максимальный контейнер образуют линии высотой 8 на индексе 1 и высотой 7 на индексе 8. Ширина контейнера равна 8 - 1 = 7, высота ограничена меньшей линией 7, поэтому объем равен 7 * 7 = 49.

Пример 2:

height = [1, 1]

Результат:

1

Ограничения:

  • n == height.length
  • 2 <= n <= 10⁵
  • 0 <= height[i] <= 10⁴

Решение

Это одна из самых популярных задач на два указателя. На первый взгляд кажется, что нужно перебрать все пары линий: берем левую линию, затем пробуем каждую правую, считаем площадь и обновляем максимум.

Такой подход работает, но его сложность O(n²). Для n = 10⁵ это слишком медленно. На интервью такой вариант можно озвучить как базовый, но после этого нужно перейти к оптимизации.

Перейдите на Premium, чтобы продолжить

Разблокируйте доступ к этой статье и всем остальным материалам с NowInterview Premium

Перейти на Premium