题目描述:

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i
的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

输入: [1,8,6,2,5,4,8,3,7]
输出: 49

解题思路:
思路一:
使用两个for循环对height数组进行遍历,不断迭代找到最大的面积,如下所示:
i为for循环所在位置,j为i之后的值,利用公式:min(height[i], height[j]) * (j - i)即可求得面积

		max_area = 0
        for i in range(len(height)):
            for j in range(i + 1, len(height)):
                temp = min(height[i], height[j]) * (j - i)
                if temp > max_area:
                    max_area = temp
        return max_area

结果: 上述解题思路的时间复杂度为O(nlogn),在输入的数据量大时回超出运行时间限制:

思路二:
使用两个值i和j分别指向数组的头部和尾部,然后利用公式:min(height[i], height[j]) * (j - i)计算面积值,并根据height[i]和height[j]的值不断更新i和j所在位置,即若height[i]>height[j],则j–,反之, i++

		i = 0 
        j = len(height) - 1
        max_value = 0
        while i != j:
            temp =  min(height[i], height[j]) * (j - i)
            if temp > max_value:
                max_value = temp
            if height[i] > height[j]:
                j -= 1
            else:
                i += 1
        return max_value

结果: 上述解题思路的时间复杂度为O(n),在数据量大时也没有超出运行时间限制:

完整代码:

class Solution:
    def maxArea(self, height: List[int]) -> int:
        '''
        方法一:
        max_area = 0
        for i in range(len(height)):
            for j in range(i + 1, len(height)):
                temp = min(height[i], height[j]) * (j - i)
                if temp > max_area:
                    max_area = temp
        return max_area
        '''
        
        '''
        方法二
        '''
        i = 0 
        j = len(height) - 1
        max_value = 0
        while i != j:
            temp =  min(height[i], height[j]) * (j - i)
            if temp > max_value:
                max_value = temp
            if height[i] > height[j]:
                j -= 1
            else:
                i += 1
        return max_value