力扣(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