题目背景:
难度;中等
要求:给你 n 个非负整数 a1,a2,...,an
,每个数代表坐标中的一个点 (i, ai)
。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)
。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水;
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
算法思想:
分两部分:
一部分是不断的缩小范围寻找下一个边界,然后计算水的体积;
始终缩小的那一边是较矮的那一边,只有缩小较小的那边才能寻求更大的一边,从而获取更大的体积;
另一部分是计算水的体积:计算的时候用高乘长表示
水的体积是由较小的板决定的,类比"短板效应
"理解一下;
用左右指针表示左边界和右边界
代码实现:
class Solution {
public:
int maxArea(vector<int>& height)
{
int l=0,r=height.size()-1;//z左右指针
int ans=0;//初始化一个变量保存水的体积
while(l<r)
{
int area=min(height[l],height[r])*(r-l);//较小的板决定能盛水的体积;水的体积=高X宽
ans=max(ans,area);//更新最大体积的水
if(height[l]<=height[r])++l;//左边界比较小 那么左边界继续右移,寻找下一个水的体积
else --r;
}
return ans;
}
};
在这里插入代码片