题目:
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。
输入输出:
输入:height = [4,3,2,1,4]
输出:16
解题思路:
看到需要两边移动考虑双指针
难点在于移动指针
- 两指针越远越好
- 边越长越好
暴力法是默认固定左指针,双指针法每次移动短的边
算法实现:
方法一:暴力法(算法复杂度O(n^2),会超时,相当于双指针算法永远固定左端点)
class Solution:
def maxArea(self, height: List[int]) -> int:
l = len(height)
max_v=0
v = 0
if l == 2:
return min(height[0],height[1])
if l <2:
return 0
for i in range(l-2):
for j in range(i,l):
v = (min(height[i],height[j]))*(j-i)
if v > max_v:
max_v = v
return max_v
方法二:双指针(左右端都要移动的时候考虑这种方法,算法复杂度O(n))
class Solution:
def maxArea(self, height: List[int]) -> int:
l = len(height)-1
max_v=0
i = 0
while i < l:
v = min(height[l],height[i])*(l-i)
max_v = max(max_v,v)
if height[i] <= height[l]:
i+=1
else:
l-=1
return max_v