【数组】4:盛最多水的容器

文章目录


Leetcode 11: 盛最多水的容器(python)

注:本人文章中内容中来自于各大佬的经验总结,仅供自身复习及学习,并无商业用途,若有时忘记标注作者及出处还请提醒,敬请见谅。

大佬思路

我想了很久,没有想出思路,于是参考了leetcode上大佬Krahets的题解,双指针思想太妙了!
以下内容均转载自leetcode的题解。

大佬思路如下:
设两指针 ii , jj ,指向的水槽板高度分别为 h[i]h[i] , h[j]h[j] ,此状态下水槽面积为 S(i, j)S(i,j) 。由于可容纳水的高度由两板中的 短板 决定,因此可得如下 面积公式 :
在这里插入图片描述
在这里插入图片描述
在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 **底边宽度 **−1​ 变短:

  • 若向内 移动短板 ,水槽的短板 min(h[i], h[j])min(h[i],h[j]) 可能变大,因此下个水槽的面积 可能增大 。
  • 若向内 移动长板 ,水槽的短板 min(h[i], h[j])min(h[i],h[j])​ 不变或变小,因此下个水槽的面积 一定变小 。

因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。

算法流程

  1. 初始化: 双指针 ii , jj 分列水槽左右两端;
  2. 循环收窄: 直至双指针相遇时跳出;
    1. 更新面积最大值 resres ;
    2. 选定两板高度中的短板,向中间收窄一格;
  3. 返回值: 返回面积最大值 resres 即可;

最后的python代码:

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

作者:jyd
链接:https://leetcode-cn.com/problems/container-with-most-water/solution/container-with-most-water-shuang-zhi-zhen-fa-yi-do/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值