11. 盛水最多的容器

1.暴力破解法(超出时间限制)

class Solution:
    def maxArea(self, height: List[int]) -> int:
        s = 0
        for i in range(len(height) - 1):
            for j in range(i, len(height)):
                if height[i] > height[j]:
                    heigh = height[j]
                else:
                    heigh = height[i]
                _s = (j - i) * heigh
                if _s > s:
                    s = _s
        return s

2. 双指针法

最初我们考虑由最外围两条线段构成的区域。现在,为了使面积最大化,我们需要考虑更长的两条线段之间的区域。如果我们试图将指向较长线段的指针向内侧移动,矩形区域的面积将受限于较短的线段而不会获得任何增加。但是,在同样的条件下,移动指向较短线段的指针尽管造成了矩形宽度的减小,但却可能会有助于面积的增大。因为移动较短线段的指针会得到一条相对较长的线段,这可以克服由宽度减小而引起的面积减小。

class Solution:
    def maxArea(self, height) -> int:
        if height[0] < height[len(height) - 1]:
            high = height[0]
            i = 1
            j = len(height) - 1
        else:
            high = height[(len(height) - 1)]
            i = 0
            j = len(height) - 2
        s = high * (len(height) - 1)
        while i < j:
            if height[i] < height[j]:
                _s = height[i] * (j - i)
                if _s > s:
                    s = _s
                i += 1
            elif height[i] == height[j]:
                _s = height[i] * (j - i)
                if _s > s:
                    s = _s
                if height[i + 1] < height[j]:
                    i += 1
                elif height[j - 1] < height[i]:
                    j -= 1
                elif height[i+1] > height[j - 1]:
                    i += 1
            else:
                _s = height[j] * (j - i)
                if _s > s:
                    s = _s
                j -= 1
        return s

你可能感兴趣的:(11. 盛水最多的容器)