题目
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水,地址。
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
解题思路
双指针问题:采用暴力法即先设置一个start,然后遍历之后的每一个位置求出面积并迭代,时间复杂度位 O ( n 2 ) O(n^2) O(n2)。面积只跟底和较矮的边有关系,所以设置两个指针分别为start和end,分别在开头和结尾,如果 h e i g h t s t a r t height_{start} heightstart> h e i g h t e n d height_{end} heightend,则把end的位置向靠近start的方向挪动,看是否还有面积更大的end,反之,把start的位置向靠近end的位置挪动,即每次都舍弃更矮的位置。
Python实现
class Solution:
def maxArea(self, height: List[int]) -> int:
i, j, maxArea = 0, len(height)-1, 0
while i < j:
maxArea = max(maxArea, min(height[i], height[j])*(j-i))
if height[i] >= height[j]:
j -= 1
else:
i += 1
return maxArea