力扣第11题“盛最多水的容器”(python解决)

题目:

思路:

 这道题我一开始想法不是暴力破题(就是计算每两个竖轴之间的容积),而是计算每两个轴之间的距离和最短轴是那个,但是做到后面,我都知道两个轴之间的距离和最短轴了,我为啥不直接计算容积呢?然后就变成了暴力破题法,但是提交之后,测试用例里面有数据量非常大的测试用例,直接超时了(一开始内存超了,优化一下),超时解决不了,两个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]        #返回头部

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值