题目链接:11. 盛最多水的容器 - 力扣(LeetCode)
普通版本(暴力枚举)
主旨:循环列举容器的大小,并留下最大的那个容器
容器大小计算公式:两个指针指向的数字中较小值∗指针之间的距离
class Solution {
public:
int maxArea(vector<int>& height) {
int Area = 0; //最大容器大小
int sz = height.size();
for(int i = 0;i<sz;i++)
{
for(int j = i+1;j<sz;j++)
{
Area = max(Area,min(height[i]*(j-i),height[j]*(j-i)));
}
}
return Area;
}
};
时间复杂度:O(N^2)
空间复杂度:O(I)
问题:这种写法会超出时间限制,无法通过
优化版本(双指针)
为了节省时间直接看这大哥的解析吧🤡
class Solution {
public:
int maxArea(vector<int>& height) {
int l = 0, r = height.size() - 1;//定义初始左右边界
int ans = 0;//真实容器大小
while (l < r)
{
int area = min(height[l], height[r]) * (r - l);//当前容器大小area = 最短的那根线 * 两根线之间的距离
ans = max(ans, area);//取当前容器大小和真实容器大小的最大值
if (height[l] <= height[r])//左线的长度小于等于右线的长度,左指针右移
{
++l;
}
else //左线的长度大于右线的长度,右指针左移
{
--r;
}
}
return ans;
}
};
时间复杂度:O(N)
空间复杂度:O(1)
~over~