原题:
给定n个非负整数a 1,a 2,...,a n,其中每个代表坐标(i,a i)处的一个点。绘制n条垂直线,使得线i的两个端点处于(i,a i)和(i,0)处。找到两条线,它们与x轴一起形成一个容器,使容器中含有最多的水。
注意:您不得倾斜容器,并且n至少为2。
求最多水问题即是求两条线之间以其中短的为长x轴间距为宽所可能组成的最大面积
解:
1思路 :对每个边遍历求其最大面积 并通过比较之后返回最大面积
2优化解。二分法求其最大面积
var maxArea = function(height) { var maxarea=0,l=0,r=height.length-1; while (l<r){ maxarea=Math.max(maxarea,Math.min(height[l],height[r])*(r-l)); if (height[l]<height[r]){ l++; }else { r--; } } console.log(maxarea); return maxarea; };
从两边的边开始 向中间求其最大面积;
最开始
Math.min(height[l],height[r])*(r-l) // 这个是 最外边的两条边的 短的那个最大的面积
//随后
if (height[l]<height[r]){ //短的那个边放弃 向中间靠拢 l++; }else { r--; }
一直重复 即可求出其中最大可存水的面积
其中 或可出现 某边x 向相反方向 边 y求得的面积大于向中间靠拢的边z的面积 其中x<z,y<z;lz<lx<ly;
例 若 x>y x.z 的面积为 x*(lx-lz) x.y面积 y(ly-lx) y.z 面积 y(ly-lz) ly>lx>lz 若 y(ly-lx)> z(lx-lz) 则 必有 y(ly-lz)>(y(ly-lx)
若 y>x x.z x*(lx-lz) x.y x(ly-lz) y.z y(ly-lz) 若 x(ly-lx)>x(lx-lz) 则必有 y(ly-lz)>x(ly-lx)