解法(C++):
(1)暴力法:遍历每一种可能
int maxArea(vector<int>& height) {
int m=0; //保存最大值
for(int i=0;i!=height.size();i++) //两层循环,遍历每一种情况
{
for(int j=i+1;j!=height.size();j++)
{
m=max(m,((j-i)*min(height[i],height[j])));
}
return m;
}
时间复杂度:O(N2)
(2)双指针法:当两根线间隔越远时,所盛水越多;用两个指针分别指向两端,每次让较矮的那根线的指针向内侧移动,获得最大值
int maxArea(vector<int>& height) {
int i=0, j=height.size()-1; //两个指针指向两端
int m=0; //保存最大值
while(i<j)
{
m=max(m,(j-i)*min(height[i],height[j])); //所盛水量
if(height[i]<height[j]) //将矮的那根线的指针向内侧移动
i++;
else
j--;
}
return m;
}
时间复杂度:O(N)