给定一个长度为 n
的整数数组 height
。有 n
条垂线,第 i
条线的两个端点是 (i, 0)
和 (i, height[i])
。
找出其中的两条线,使得它们与 x
轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1] 输出:1
提示:
分析:使用了双指针策略,一个指针从数组的开始出发,另一个指针从数组的末尾出发。在每一步中,计算两个指针指向的线段形成的面积,并根据两个线段的高度决定移动哪个指针。移动较短线段的指针,因为较短线段限制了可能的最大面积,而移动较长的指针不会增加面积。这个过程一直持续到两个指针相遇,此时所有的可能面积都已经计算过,最大面积也就找到了
C++代码如下:
class Solution {
public:
// maxArea函数计算最大可以盛放的水量
int maxArea(vector<int>& height) {
int left = 0; // 初始化左指针在数组的起始位置
int right = height.size()-1; // 初始化右指针在数组的末尾位置
int res = 0; // 初始化最大面积结果为0
while(left<right) // 当左指针小于右指针时,继续循环
{
// 计算当前左右指针指向的线段和x轴形成的面积,并与之前的最大面积比较,取较大值
res = max(res,min(height[left],height[right])*(right-left));
// 如果左指针指向的线段高度小于右指针指向的线段高度,移动左指针
if(height[left]<height[right])
{
left++;
}
else
{
// 否则,移动右指针
right--;
}
}
// 返回计算得到的最大面积
return res;
}
};