力扣 11 盛水最多的容器
解法:使用对撞指针解题。
思路: 定义两个指针 left(指向数组首端)和 right(指向数组尾部),来计算其容积;
让对应数值较小的指针移动一步,再次求其容积;直至两个指针相遇,从其求得容积中找出最大值就是本题要求的结果。
本题代码使用封装的函数和不使用封装函数的解法。
1. 使用封装的函数的解法:
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size()-1,maxv = 0;
while(left < right)
{
//求所在区间的相应容积
int v = min(height[left],height[right]) * (right-left);
//更新最大容积
maxv = max(maxv,v);
//更新指针位置
if(height[left] <= height[right])
{
++left;
}else{
--right;
}
}
return maxv;
}
};
2. 不使用封装函数的解法
class Solution {
public:
int maxArea(vector<int>& height) {
int left = 0, right = height.size()-1,maxv = 0,minHeight = 0;
while(left < right)
{
//找出最低高度
if(height[left] < height[right])
{
minHeight = height[left];
}else{
minHeight = height[right];
}
//确定空间长度
int len = right - left;
//求所在区间的相应容积
int v = minHeight * len;
//更新最大容积
if(maxv < v)
{
maxv = v;
}
//更新指针位置
if(height[left] <= height[right])
{
++left;
}else{
--right;
}
}
return maxv;
}
};