Контейнер с наибольшим количеством воды
7703 단어 mediumkotlinleetcodealgorithms
Постановка задачи
Дан целочисленный masсив значений высоты
height
размера n
, т.е. нарисовано n вертикальных линий.Необходимо найти две линии, которые вместе с осью X образуют контейнер, который содержит наибольшее количество воды.
Верните в качестве результата максимальное количество воды, которое может храниться в контейнере.
Примеры входных данных
프라이머 1
Входные данные:
높이 = [1, 8, 6, 2, 5, 4, 8, 3, 7]
결과:
49
예문 2
Входные данные:
높이 = [1, 1]
결과:
1
레슈니예
Для решения этой задачи надо использовать жадный алгоритм с двумя указателями. На каждом шаге необходимо вычислять максимально возможный результат. Для этого мы начнем итерироваться с двух концов контейнера. Продвигаться будем левым или правым указателем в одну itерацию. Выбор указателя будет зависить от того, является ли он не большим.
Решение по шаgamm
1) Сначала надо инициализировать переменную
max
, которую вернем в качестве результата.var max: Int = 0
2) Затем необходимо инициализировать левый и правый указатель.
var left: Int = 0
var right: Int = height.size - 1
3) Для итерации по списку вершин реализуем цикл
while
. условием окончания цикла является 초 left
и right
, либо то 갑변 Â 디어 104501410 На каждом этапе считаем текущий объем воды.while (left < right) {
val curr = Math.min(height[left], height[right]) * (right - left)
...
}
4) Далее сравниваем текущий объем воды с максимальным и наибольшее значение присваиваем переменной результата.
...
max = Math.max(curr, max)
...
5) Затем сравниваем левое и правое значение высоты вершин. Если правая вершина больше, то необходимо перевинуть левую вершину к центру. Иначе - двигаем правую вершину к центру.
...
if (height[left] < height[right]) {
left++
} else {
right--
}
...
6) В конце возвращаем переmenнную
right
в качестве результата....
return max
Оценка сложности
폴노예 레쉬니에
fun maxArea(height: IntArray): Int {
var max: Int = 0
var left: Int = 0
var right: Int = height.size - 1
while (left < right) {
val curr = Math.min(height[left], height[right]) * (right - left)
max = Math.max(curr, max)
if (height[left] < height[right]) {
left++
} else {
right--
}
}
return max
}
Reference
이 문제에 관하여(Контейнер с наибольшим количеством воды), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ivsivak/kontieinier-s-naibolshim-kolichiestvom-vody-4l5f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)