题目给定n个非负整数a1,a2,...,an,每个数代表坐标中的一个点(i,ai)。在坐标中画n条竖线,竖线i的两个端点分别为(i,ai)和(i,0)。找到其中两条线,使它们与x轴一起形成一个盛水最多的容器。解释:容器不能倾斜,n的值至少为2。图中的竖线表示输入数组[1,8,6,2,5,4,8,3,7]。本例中容器最大能装的水量(蓝色部分)为49。解法一:排序加遍历,时间复杂度O(nlogn)从大到小排序维护三个变量:当前最低高度,当前高度最左边,和当前最右边最大的面积是当前高度×(当前最右边-当前最左边)枚举(高度):x.append((i,n))x.sort(key=lambdax:x[1],reverse=True)h=min(x[0][1],x[1][1])l=min(x[0][0],x[1][0])r=max(x[0][0],x[1][0])ans=h*(r-l)foriinrange(2,len(x)):l=min(x[i][0],l)r=max(x[i][0],r)h=min(h,x[i][1])ans=max(ans,h*(r-l))returnans方法二:双指针,时间复杂度O(n)这道题的最优解有一个特点:如果i和j位置是最大容量,则“i是0到i中最高的高度”或“j是从j到最后的最高高度”。因为如果两者都不满足,那么选择两个最高的得到的容量一定要高于i,j的容量。所以这个可以取先令i=0,令j=len(height)然后循环计算当前容量,每次循环如果i的高度大于j,则j-=1,如果i的高度小于比j,则i-=1。记录进程中的最大容量,即为答案。类解决方案:defmaxArea(self,height:List[int])->int:i=0j=len(height)-1ans=0whilei
