题目描述:给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。、

解题思路(官方思路):
method1:暴力求解思想:将所有的两两垂直线的组合搭配起来求解最大面积,设置一个全局变量maxValue来记录最大储水量
在接下来的两两直线组合的求解储水量的过程中,如果当前组合的储水量比,全局的最大储水量还要大,则更新全局最大
储水量.当所有的两两组合运行结束后,maxValue中存放的就是最大储水量,返回即可.
(此方法时间复杂度太大)
时间复杂度O(n2),空间复杂度O(1)

int maxValue=0;//用于记录最大储水量
for(int i=0;i<height.size();i++){
for(int j=i+1;j<height.size();j++){//所有线段长度的组合
int tempValue=min(height[i],height[j])*(j-i);//计算当前组合的储水量
if(tempValue>maxValue)
maxValue=tempValue;
}
}
return maxValue;

下图是采用暴力法的运行时间图

LeetCode_11_Container With Most Water_时间复杂度

method2:双指针法:由题意易知,最大储水量是有两条边中最短边的高度和两条边之间的x轴的距离所决定的,我们要想的到最大储水量,就需要移动最短边,虽然这样做可能会使x轴的长度变小,但是可能会换取一条更长的边,所以总的面积有可能会增大。如果替换最大边,储水量还是由最短的那条边所决定的,反倒会使x轴的距离缩小,所以不会对结果有任何好的帮助。
采用此种方法时间复杂度为O(n),空间复杂度O(1)

int low=0;
int high=height.size()-1;
int maxValue=0;//用于记录全局最大储水量
while(low<high){
int tempValue=min(height[low],height[high])*(high-low);//记录当前组合的储水量
if(tempValue>maxValue)
maxValue=tempValue;//更新最大储水量
if(height[low]<height[high])//将当前组合中较短的边进行替换
low++;
else
high--;
}
return maxValue;

下图是采用双指针法的运行时间图

LeetCode_11_Container With Most Water_运行时间_02