LeetCode笔记 ------11. 盛最多水的容器

写在前边

本文为系列文章,记录自己在leetcode上刷题的一些笔记,欢迎大家一块儿讨论。

题目描述

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。画 n 条垂直线,使得垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

注意:你不能倾斜容器,n 至少是2。

解决思路

方法一:
暴力解法:第一个数字和后边所有的数字一一比较进行计算面积,很好理解,话不多说直接上代码

var maxArea = function(height) {
   var i,j;
    var maxarea=0;
    for(i=0;i<height.length;i++){
        for(j=i+1;j<height.length;j++){
           maxarea = Math.max(Math.min(height[i],height[j]) * (j-i),maxarea);
        }
    }
    return maxarea;
};

但是这种方法 时间复杂度为 O(n^2)计算n*(n-1)/2种组合高度。

方法二:
采用双指针法,设两个指针,一个从前向后,一个从后向前进行遍历,这道题很像生活中的木桶原理,都是受限与数字较小的数字,此外,两线段距离越远,得到的面积就越大。
现在,为了使面积最大化,我们需要考虑更长的两条线段之间的区域。如果我们试图将指向较长线段的指针向内侧移动,矩形区域的面积将受限于较短的线段而不会获得任何增加。但是,在同样的条件下,移动指向较短线段的指针尽管造成了矩形宽度的减小,但却可能会有助于面积的增大。因为移动较短线段的指针会得到一条相对较长的线段,这可以克服由宽度减小而引起的面积减小。来看这段代码。

var maxArea = function(height) {
    var l = 0 ;
    var r = height.length-1;
    var maxarea = 0;
    while(l<r){
        maxarea = Math.max(maxarea,Math.min(height[l],height[r])*(r-l));
        if(height[l]<height[r])
            l++;
        else
            r--;   
    }
    return maxarea;
};

代码啥的已经更新在GitHub上,欢迎大家指点github

猜你喜欢

转载自blog.csdn.net/liu0415111/article/details/81165529