题目
思路
基本的思路是使用双指针:
- left是从最左边开始,right是从最右边开始,计算由left和right围成的区域的容器的容积为tmp,将tmp和max比较,max取当前可以取到的最大值。
- 然后对于left和right位置的height进行比较,哪侧的height比较小,就移动哪侧向中心移动。
- 重复上述的过程,直到left和right相遇。
我认为这道题的代码不难实现,但是如何解释用这个思路来写代码比较重要。
为什么哪侧height小,就移动哪侧?
因为在当前的状态下,不论哪一边发生移动,都必定会导致容器的宽度-1。同时如果移动了height较大的那一侧的指针,那么后序的容积不可能会比当前的max再大了(因为会受制于小的那一侧的高度),所以需要移动height较小的那一侧的指针。
代码
var maxArea = function(height) {
let max = 0, left = 0, right = height.length - 1;
while(left < right){
let tmp = Math.min(height[left], height[right]) * (right - left);
max = max > tmp? max: tmp;
if(height[left] < height[right]){
left++;
}else{
right--;
}
}
return max;
};