lc011.盛最多水的容器

 

题目链接

我大意了啊,这题很快就知道应该用双指针做,可是我在移动指针的条件的时候一直没有想对,我总是在考虑按照指针所指的旁边那块板的高度来判断是否该移动指针,而正确思路实际上就简单地按照指针所指的那块板来判断即可,因为若左边的板高度小于右边的板的高度,只有先移动左边指针才有可能或者更大的面积(反之不行,因为如果先移动右指针会导致面积严格减小,达不到效果),实现如下所示。这个算法的时间复杂度是O(N),空间复杂度是O(1)。

class Solution:
    def maxArea(self, height: List[int]) -> int:
        ans = float("-inf")
        left, right = 0, len(height)-1
        while left < right:
            min_height = min(height[left], height[right])
            distance = right - left
            area = distance*min_height
            ans = max(ans, area)
            if height[left] < height[right]:
                left += 1
            else:
                right -= 1
        return ans