leetcode hot100 双指针:盛水最多的容器

文章讲述了如何通过双指针优化算法解决LeetCode中的盛水最多的容器问题,避免了不必要的重复遍历,将时间复杂度降低到O(n)。作者介绍了两种方法,一种是暴力解法和双指针策略的分析过程。
摘要由CSDN通过智能技术生成

leetcode hot100 双指针:盛水最多的容器

题目

在这里插入图片描述
方法一:不需要动脑子,直接暴力解掉,此时的时间复杂度是n2。

class Solution:
    def maxArea(self, height: List[int]) -> int:
        res = 0
        for i in range(len(height)):
            for j in range(i + 1,len(height)):
                cur_res = min(height[i],height[j]) * (j - i)
                res = max(res,cur_res)
        return res

很遗憾,在第50个测试用例时超时了
在这里插入图片描述
因此,要想一种时间复杂度低于n2的方法,通常来说,双层遍历我们应该第一时间就会想到双指针的方法,用某一个指针的移动来避免一些无用的重复遍历。
在这道题中,我们要找到盛水最多的情况。首先我们要想到计算水的体积应该是:两侧高度较低的一段 * 两端的坐标差。有了这一点,我们就可以判断,当两侧一高一低时,我们移动较高的一侧的指针是没有意义的,因为较低的一端决定了容器的最高高度,移动后两端点的差值也会变小,体积只可能是小于等于。因此,我们只需要移动每次两端点中较低的一端,去寻找下一个可能大于另一端点的高度,才有可能使容器的容积变大。因此,该题的做法就是设置两个指针在数组的两端,首先默认容器的底长最大,接着按照上述规则移动即可。

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

完结!通过!

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值