leetcode 每日一题 11. 盛最多水的容器

1.暴力法

思路:

找出每个子区间,计算出面积,找出最大值

代码:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        areamax = 0
        for i in range(len(height)):
            for k in range(i+1,len(height)):
                area = min(height[i],height[k])*(k-i)
                if area > areamax:
                    areamax = area
        return areamax

2.双指针法

思路:

设置双指针i,j分别位于容器壁两端,根据规则移动指针,并且更新面积最大值,直到i==j时返回面积最大值。由于面积大小由两侧中的较小值确定,并且此时区间长度已经是以较小值为边所能达到的最大区间,所以此较小值所构成的面积已经是最大的,故将较小值的指针向内移动。

例如:

[1,8,6,2,5,4,8,3,7]

 

代码:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        l, r = 0, len(height) - 1
        ans = 0
        while l < r:
            area = min(height[l], height[r]) * (r - l)
            ans = max(ans, area)
            if height[l] <= height[r]:
                l += 1
            else:
                r -= 1
        return ans

 

 

posted @ 2020-04-24 10:09  nil_f  阅读(144)  评论(0)    收藏  举报