【LeetCode 热题 100】11. 盛最多水的容器 | python 【中等】

边练习边更新,加油!!! 

更得没有做得快,乐

 题目:

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

注意:

  1. 双指针的典型应用!!!(做完之后茅塞顿通)

 标准做法:

先把两个指针指向0和-1

注意:①指针只能向内移动②只有矮的柱子变高,容积才有可能上升,所以谁矮移谁

class Solution:
    def maxArea(self, height: List[int]) -> int:
        l, r = 0, len(height) - 1
        ans = 0
        while l < r:
            area = min(height[l], height[r]) * (r - l)
            ans = max(ans, area)
            if height[l] <= height[r]:
                l += 1
            else:
                r -= 1
        return ans

作者:力扣官方题解
链接:https://leetcode.cn/problems/container-with-most-water/solutions/207215/sheng-zui-duo-shui-de-rong-qi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

自己的做法:【看题解后通过并超过】

参考了答案的思路,在寝室画了10分钟图

[ 用时: 7 m 42 s ]参考答案的向内侧移动的方法,只移动高的,不移动低的,只计算移动后高的,不计算移动后低的

可能比题解要算得快一些?因为在没有移动到更高的杆子的时候,没让它计算

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        a = 0
        b = len(height)-1
        v = (b-a)*min(height[a],height[b])
        max_v = v
        while a != b:
            if height[a]<height[b]:
                a += 1
                if height[a]>height[a-1]:
                    v = (b-a)*min(height[a],height[b])
            else:
                b -= 1
                if height[b]>height[b+1]:
                    v = (b-a)*min(height[a],height[b])
            if max_v<v:
                max_v = v
        return max_v

 1.超时O(n2):把所有容积储存起来是一个多么朴实无华的想法

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        # 长:j-i
        # 宽:min(height[i],j)
        # 最简单:每个都储存下来
        l = []
        for i,iz in enumerate(height):
            for j,jz in enumerate(height[i+1:]):
                l.append((j+1)*min(iz,jz))
        return max(l)

  2.超时O(n2):不存了,直接判断

只能说,内存从O(n2)到O(1)也是质的飞跃(只能显示出之前很蠢吧!!!找max还遍历一次)

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        # 长:j-i
        # 宽:min(height[i],j)
        # 最简单:每个都储存下来
        max_v = 0
        for i,iz in enumerate(height):
            for j,jz in enumerate(height[i+1:]):
                v = (j+1)*min(iz,jz)
                if max_v < v:
                    max_v = v
        return max_v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值