11.盛最多水的容器
题目描述
给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
思路
双指针法
height=[a1,a2,…,an]
起始两个指针l、r分别指向n个非负整数的两端,接着计算容器容积area = min(height[l], height[r]) * (r - l),然后移动l、r指针中指针指向元素较小的那个指针(向另一个指针所在的方向移动),再计算area,…,以此类推,然会最大的area代码
class Solution(object):
def maxArea(self, height): """ :type height: List[int] :rtype: int """ # 容器的高为height中每一对值中较小的 # 容器的宽为每一对值的下标相减,后者下标减去前者下标 # Area = H x W n = len(height) # 输入数组的长度 max = 0 # 最大容器容量 for i in range(n): for j in range(i+1, n): h = min(height[i], height[j]) w = j - i if h * w > max: max = h * w return max def maxArea1(self, height): 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: # height[l] >= height[r] r -= 1 return ans
if name == “main“:
slt = Solution() height = [1, 8, 6, 2, 5, 4, 8, 3, 7] max_area = slt.maxArea(height) print(max_area)