其他分享
首页 > 其他分享> > 力扣(leetcode) 11. 盛最多水的容器 (短板木桶原理详解)

力扣(leetcode) 11. 盛最多水的容器 (短板木桶原理详解)

作者:互联网

题目在这:https://leetcode-cn.com/problems/container-with-most-water/

思路分析:

本题容易想到使用双指针维护水桶的左边和右边。
开始时,L指向最左端,R指向最右端。
我们将较垂直高度短的那一边往里面挪动。

为什么移动较短的一边?

(本题重点,必看!)

面积取决于短板高度和底面长度 面积 = 短板高 * 底面长

无论是移动短板或者长板,我们都只关注移动后的新短板会不会变长,所构成面积会不会变大,而每次移动的木板都只有三种情况,比原板短,比原板长,与原板相等;

如果向内移动短板,对于新的木板 1.比原板更短,则新面积更小,2.比原板更长,则新面积可能变大或不变,3.和原木板相等,则新面积变小;

如向内移动长板,对于新的木板:1.比原短板短,则新面积更小。2.与原短板相等或者比原短板长,则新面积不变或变小。所以,向内移动长板,一定不能使新面积增大。(因为短板没变,即底边变短了,高没变)

完整代码

 def maxArea(self, height: List[int]) -> int:
                
        left = 0
        right = len(height) - 1
        area = 0

        while left < right:
            cur = min(height[left], height[right]) * (right - left) # 面积 = 短板高 * 底面长
            area = max(area, cur)
            # 较短的垂直线往中间移动
            if height[left] < height[right]:
                left += 1
            else: # 长的往中间动
                right -= 1

        return area

标签:11,right,面积,height,力扣,最多水,短板,移动,left
来源: https://blog.csdn.net/qq_38737428/article/details/118958358