针对第11 题,盛最多水的容器。
首先,搞懂左右指针,去掉短的指针,的意思,就是,边界是短指针的,最大值记录了,你可以出去玩啦
而在实际的写代码中,不知不觉,多做了很多工作,做了两遍。对比
引用代码,绝无贬低他人的意思,,因为我看到题目时,直接写的是 return i_do_not_know
class Solution:
def maxArea(self, height: List[int]) -> int:
big,l, r = 0,0, len(height) - 1
while l < r:
big = max(big, min(height[l], height[r]) * (r - l) )
if height[l] < height[r]: l += 1
else:r -= 1
return big
代码看起来,没有问题,但是,height[l] < height[r] 比较了两次。两次!!!
优化了,如果看不懂,看第3版本。
class Solution:
def maxArea(self, height: List[int]) -> int:
ans=0
h=height
ll,r=0,len(h)-1
while ll<r:
if h[ll]<h[r]:
t=(r-ll)*h[ll] #直接就知道谁小啦
ll+=1
else:
t =(r-ll)*h[r]
r -=1
ans=ans if ans>t else t
#ans=max(ans,t)
return ans
class Solution:
def maxArea(self, height: List[int]) -> int:
maxans=0
'''
for i in range(0,len(height)-1):
for j in range(i+1, len(height)):
hh= min(height[i],height[j])* (j-i)
if hh >maxans :maxans=hh
'''
left=0
right=len(height)-1
while left <right:
if height[left] > height[right]:
hh= min(height[left],height[right])* (right-left)
if hh >maxans :maxans=hh
right -=1
else:
hh= min(height[left],height[right])* (right-left)
if hh >maxans :maxans=hh
left +=1
return maxans
min(height[left],height[right]) 是不是 guai? 细细看自己的代码,优化来自数学,也来自写的过程中。
另外,如果 < 已经能够解决问题,不要用 <= 在这个题目里。
网友评论