我在处理有关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;
答案 0 :(得分: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轴的遍历时,您将存储最大的面积。