了解leet代码的代码片段大多数水的问题

时间:2019-11-17 00:45:01

标签: javascript

我在处理有关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;

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轴的遍历时,您将存储最大的面积。