2020-04-18

2020-04-18  本文已影响0人  木马音响积木

针对第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? 细细看自己的代码,优化来自数学,也来自写的过程中。

另外,如果 < 已经能够解决问题,不要用 <= 在这个题目里。

上一篇下一篇

猜你喜欢

热点阅读