解题思路:
首先我们定义了一个result
,用来实时更新每次计算的最大容积
接下来我们创建了两个指针left
与 right
,这两个指针的初始位置分别为数组的最左端和最右端,我们从这个状态进入循环,计算每一步的容积,循环终止的条件是当左指针和右指针重叠,下面是本题的核心环节:
- 首先计算出最左端与最右端之间的间距,作为宽度
w
,且取这两个指针指向值的较小者作为高度h
(木桶存水的高度取决于最短的那个木板)两者之积便是此时的容积。 - 将此容积
w*h
与result
的值作比较,如果两者直接大于result
,则更新result
的值,否做则不做修改(解题中使用三目运算符进行操作)。 - 接下来到了关键时刻,两个指针按照怎样的规则移动,才能正确的求解出最大值,而不错过容积最大值呢?还是木桶理论,存水的高低只能取决于最短的那个木板,所以我们需要移移动两侧较小的那个指针,如果左侧小,就执行
left--
,反之则执行right++
。
以上就是这个题目的解法
代码如下
var maxArea = function (height) {
//创建返回值
let result = 0;
//创建两个指针(首尾指针)
let left = 0;
let right = height.length - 1;
//进入循环
while (left < right) {
//计算出此时的width
let w = right - left;
//计算高度
let h = height[left] < height[right] ? height[left] : height[right];
//计算容积
result = result < w * h ? w * h : result;
//移动高度较低的指针,向对侧移动
height[left] < height[right] ? left++ : right--;
}
return result;
};
总结
本题采用了双指针解法,通过不断移动左指针和右指针,最终一步一步求解出最大的容积,刚开始无脑暴力枚举,没想到超时啦~