我在处理与Leetcode有关的水最多的集装箱
问题:
给出n个非负整数a1,a2,...,an,其中每个代表坐标(i,ai)上的一点。绘制n条垂直线,使得线i的两个端点位于(i,ai)和(i,0)。找到两行,它与x轴一起形成一个容器,这样该容器包含最多的水。
注意:您可能不会倾斜容器并且n至少为2。
问题链接:https://leetcode.com/problems/container-with-most-water
我偶然发现了此解决方案
var maxArea = function(height) {
let res = l = 0, r = height.length - 1, cur;
while (l < r){
cur = Math.min(height[l], height[r]) * (r - l);
if (cur > res){
res = cur;
}
height[l] <= height[r] ? l += 1: r -= 1;
}
return res;
};
在上面的代码中,我无法理解这两行
cur = Math.min(height[l], height[r]) * (r - l);
和
height[l] <= height[r] ? l += 1: r -= 1;
以及他们为什么要做height[r]) * (r - l)
和height[l] <= height[r] ? l += 1: r -= 1;
这是因为难题在于找到容纳最多水的容器。给定具有两个高度不同的容器的容器,水的区域被限制为较小的高度,因此cur (area) = minimum of (left height, right height) * length
。
下一步是遍历点的其余部分以找到更大的区域。因此,您必须停留在较高的一侧,而跳过较短的一侧,希望下一侧会更高以最大化面积。因此height[l] <= height[r] ? l += 1: r -= 1;
等于if left height is less or equal than right height, left move by one, right remains. if right is less, right move by one (towards the center), left remains
。
这样做,此人正在寻找一对最高的高度,并且在完成x轴的遍历时,您将存储最大的面积。