解法(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)