«Контейнер с наибольшим количеством воды» — фаворит LeetCode. Ваша задача — написать функцию, которая принимает массив чисел и возвращает максимальную площадь воды, которая может заполнить контейнер, определяемый «высотами», представляющими высоту стен; если вы не следите, это нормально! Мы к этому придем :)

Эта задача является умеренно сложной, если у вас есть опыт работы с математикой, по крайней мере, для меня она была умеренно сложной. Я прошел 80% тестовых случаев, прежде чем мне пришлось искать то, что мне не хватало.

ПРОФЕССИОНАЛЬНЫЙ СОВЕТ. Не тратьте более 30 минут на удушающие точки. Это ненужная трата времени и, вероятно, не даст положительных результатов. И даже если вы в конце концов решите проблему, вы просто потратите часы значимого времени на «решение», когда могли бы потратить время на «понимание».

График представляет собой массив стен, заполненных водой до максимально допустимого/ возможного пространства.

Итак, глядя на это, мы можем понять, что нам нужно вычислить максимальную площадь между всеми высотами на нашем графике.

Нам нужно будет отслеживать максимальную площадь и края нашего «резервуара для воды».

Итак, давайте прыгнем вглубь и решим эту проблему (полный каламбур).

function maxAreaOfWater(heights){
     let maxArea=0;
     let left = 0; 
     let right = heights.length -1;
     while(left < right){
     maxArea = Math.max(maxArea, Math.min(height[left],              height[right])* (right - left ));
     if(height[left] < height[right]){
               left++;
          }else{
               right--;
         }
     }
   return maxArea;
}

Итак, я написал кучу кода, но какое, черт возьми, это имеет отношение к чему-либо? что это означает?

Ну, сейчас я объясню.

Итак, мы входим в функцию out и сразу же создаем экземпляры некоторых переменных, у нас есть maxArea, которая будет отслеживать нашу maxArea… у нас есть left и right это будут указатели, используемые для определения различных областей внутри нашего контейнера.

Затем мы создаем цикл while, который будет выполняться до тех пор, пока левый индекс не станет больше правого индекса; левый и правый пределы будут смещаться влево и вправо до тех пор, пока не будут найдены самые большие области… лучший способ представить это — посмотреть на наш график выше и представить, как движутся указатели.

наша maxArea устанавливается путем сравнения текущей maxArea с НАИМЕНЬШИМ ЗНАЧЕНИЕМ, потому что это максимально возможный уровень воды, умноженный на расстояние между правым (большее значение) и левым (меньшее значение). Это вернет максимальное значение и установит его в maxArea.

Мы повторяем этот процесс до тех пор, пока все левые указатели не будут вынуждены передать правый указатель из-за отсутствия других вариантов. Примечание: если стороны равны, левый указатель увеличивается.

Я надеюсь, что это прояснило все проблемы, которые у вас могли возникнуть с этой проблемой... логика максимального значения немного «умопомрачительна». Дайте ему время, повторение это закон обучения.