题目来源:leetCode


解法
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0,right = height.size()-1;
int maxWater = 0;
while(left<right)
{
int width = right-left;
int currentWater = width * min(height[left],height[right]);
maxWater = max(maxWater, currentWater);
if(height[left] < height[right])
{
left++;
}else{
right--;
}
}
return maxWater;
}
};
双指针法,我们可以发现,容器的水量 = 宽度 × min(左高, 右高)
所以移动较高的一边不会增加水量
如果移动较高的那边,宽度减小,但高度不会超过原来的较矮值
水量只会减少或不变
移动较矮的一边可能增加水量
虽然宽度减小,但可能找到更高的边
有机会获得更大的 min(新高度, 另一边高度)
大家可以用[1,2,3,4,5]这个数组自己想一下。
为什么right指针是size-1,而不是0?
最大化宽度:一开始就有最大的宽度(n-1)
逐步优化:通过移动较矮的指针,在宽度减小的同时寻找更高的高度
932

被折叠的 条评论
为什么被折叠?



