Поставьте указатели на крайние линии, вычисляйте площадь и двигайте указатель у меньшей высоты. Так находится максимум за O(n) времени и O(1) дополнительной памяти.
Дан целочисленный массив height длины n. Проведены n вертикальных линий, при этом два конца i-й линии находятся в точках (i, 0) и (i, height[i]).
Поставьте указатели на крайние линии, вычисляйте площадь и двигайте указатель у меньшей высоты. Так находится максимум за O(n) времени и O(1) дополнительной памяти.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан целочисленный массив height длины n. Проведены n вертикальных линий, при этом два конца i-й линии находятся в точках (i, 0) и (i, height[i]).
Найдите две линии, которые вместе с осью абсцисс (осью x) образуют контейнер, вмещающий максимальное количество воды.
Верните максимальный объём воды, который может вместить такой контейнер.
Обратите внимание, что наклонять контейнер нельзя.
Пример 1:
Ввод: height = [1,8,6,2,5,4,8,3,7] Вывод: 49 Объяснение: Указанные вертикальные линии представлены массивом [1,8,6,2,5,4,8,3,7]. В этом случае максимальная площадь воды (синяя область), которую может вместить контейнер, равна 49.
Пример 2:
Ввод: height = [1,1] Вывод: 1
Ограничения:
n == height.length 2 <= n <= 10^5 0 <= height[i] <= 10^4
Ответ
Поставьте указатели на крайние линии, вычисляйте площадь и двигайте указатель у меньшей высоты. Так находится максимум за O(n) времени и O(1) дополнительной памяти.
def max_area(height):
left, right = 0, len(height) - 1
best = 0
while left < right:
best = max(best, (right - left) * min(height[left], height[right]))
if height[left] <= height[right]:
left += 1
else:
right -= 1
return best
При фиксированной меньшей границе движение другой только уменьшает ширину и не может увеличить минимальную высоту. Поэтому меньшую границу можно безопасно отбросить; при равенстве — любую. Для первого примера получаем 7 × 7 = 49.