LeetCode11——盛最多水的容器
题目:
给定 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
方法一:暴力解法
简而言之,就是求出所有的面积,在找出最大值,思路简单,就不做分析,直接上代码:
def max_area(height: list) -> int: if len(height) == 0: return 0 if len(height) == 1: return height[0] ret = [] interval = len(height) - 1 i = 0 while i < len(height) and interval > 0: j = min(height[i], height[i + interval]) ret.append(interval * j) i += 1 if i + interval > len(height) - 1: i = 0 interval -= 1 return max(ret)
方法二:双指针法
暴力法虽然简单,但是时间复杂度太高,速度太慢,所以能不能找一个更快的方法呢?
因此,可以定义两个指针,一个指向列表起点,一个指向列表最后,计算面积,在计算面积之前需要判断两个指针指向元素的大小,并且从小的那一方先向前遍历。
代码如下:
def max_area(height: list) -> int: left = 0 right = len(height) - 1 maxArea = 0 while left < right: b = right - left if height[left] < height[right]: h = height[left] left += 1 else: h = height[right] right -= 1 area = h * b if area > maxArea: maxArea = area return maxArea

浙公网安备 33010602011771号