题目:
思路:
这道题我一开始想法不是暴力破题(就是计算每两个竖轴之间的容积),而是计算每两个轴之间的距离和最短轴是那个,但是做到后面,我都知道两个轴之间的距离和最短轴了,我为啥不直接计算容积呢?然后就变成了暴力破题法,但是提交之后,测试用例里面有数据量非常大的测试用例,直接超时了(一开始内存超了,优化一下),超时解决不了,两个for循环怎么都是O(n^2)级别的,然后看了题解里面的解题思路,原来是采用双指针方式。确定left轴和right轴中最短的那根,短的往内部移动一个单位(因为短轴往内部移动,容积可能增大也可能减小。长轴往里面移动,容积一定减小,因为底面积减小,高度可能减小或者不变,高度由短轴决定,在长轴往内部移动情况下,最大的面积就是最左和最右的两个围成的容积,显然不是),然后判断新形成的容器容积和已知最大的容积比,大的保留,小的舍弃。
代码:
class Solution:
def maxArea(self, height: List[int]) -> int:
length = len(height)
right = length -1
left = 0
s = min(height[right],height[left])*(right-left) #最外围容器的容积
temp_list1 =[s]
while right != left : #左右轴相遇,即遍历完所有竖轴
if height[right] >=height[left]:
left +=1
else:
right -=1 #选择短轴向内部移动
s = min(height[right],height[left])*(right-left) #计算形成容器的容积
if s>temp_list1[0]: #大的话就插到头部,把尾部再删掉
temp_list1.insert(0,s)
temp_list1.pop()
s = 0
return temp_list1[0] #返回头部