Контейнер с наибольшим количеством воды

Давайте разберем задачу контейнера с наибольшим количеством воды. Ее можно найти по ссылке Container With Most Water

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



Дан целочисленный 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


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


  • По времени - O(n). По списку выполняется один проход.
  • По памяти - O(1). Количество используемой памяти не зависит от размера входного массива.

  • 폴노예 레쉬니에




    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
    }
    

    좋은 웹페이지 즐겨찾기