盛最多水的容器,leetCode热题100,C++实现
题目来源:leetCode
11. 盛最多水的容器 - 力扣(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)
逐步优化:通过移动较矮的指针,在宽度减小的同时寻找更高的高度