力扣 11 盛最多水的容器
题目
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
思路
从两端出发,用left指向最左,right指向最右,这样可以保证面积的横轴差值是最大的。
maxArea_记录最初始的面积大小,之后比较左右边纵坐标的大小,移动较小的一边,(左边的纵坐标小则left++,右边的纵坐标小则right–)
理由:因为面积的纵轴最终选取的是左右两个点纵轴的最小值,例如现在输入的是[1,8,3,7]
left=0, height[left]=1;
right=3,height[right]=7;
因为此时横坐标的差值最大,因为height[left]是小的,那么无论right怎么移动,最终选取的纵坐标都是<=height[left],所有只有移动纵坐标较小的一端,才能保证在横坐标差减小的情况下面积反而变大。
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size() - 1;
int maxArea_ = (right - left) * min(height[left], height[right]);
while (left < right)
{
maxArea_ = max(maxArea_ , (right - left)* min(height[left], height[right]));
if (height[left] > height[right]) right--;
else left++;
}
return maxArea_;
}
};