思路:双指针+贪心算法
/**
* @param {number[]} height
* @return {number}
*/
var maxArea = function (height) {
if (height.length === 2) {
return Math.min(height[0], height[1]);
}
// 公式:maxArea = Math.min(height[i], height[j]) * Math.abs(i - j)
let i = 0;
let j = height.length - 1;
let ans = 0;
while (i < j) {
ans = Math.max(ans, Math.min(height[i], height[j]) * (j - i));
if (height[i] < height[j]) {
i++;
} else {
j--;
}
}
return ans
};
const res = maxArea([4, 3, 2, 1, 4]);
console.log(res);
- 我们选取两个位置i,j,其中i=0,j=height-1,即分别在列表height的首尾
- 排除特殊情况height.length===2,此时无需计算,直接根据短板理论返回最小值即可
我们令双指针分别向数组重心移动,在这里我们需要弄明白一个公式:
maxArea = Math.min(height[i], height[j]) * Math.abs(i - j)
//最大面积 = 较短的边长 x 最大的下标差
每次移动指针前都需要比对height[i],height[j]的值的大小,确保我们留下较大的那一个,而在小的那一边继续向中心移动,比如:height[i] < height[j],则j不动而i向右移动
- 在这个过程中我们只需要留下最大的Math.min(height[i], height[j]) * (j - i)即可。