题目描述:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
解题思路:
本质上就是一个算面积的问题,取两条线中较短的一条与两条线的间隔相乘即为当前围成的面积。所以很容易就想到双指针的做法,即左指针最开始在最左端,右指针最开始在最右端,逐步向中间逼近。每次移动的是指向较短线的那个指针,因为限制面积大小的是较短的一根,移动较短的一根才有可能将面积变大。若移动较长的一根,底长变短,高<=较短的一根,面积永远不可能变大。
完整代码:
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function(height) {
var ans=0;
let l=0,r = height.length-1;
while(l<r){
if(ans < (r-l) * Math.min(height[l],height[r])){
ans=(r-l) * Math.min(height[l],height[r]);
}
if(height[l]>=height[r]){
r--;
}else{
l++;
}
}
return ans;
};