0
点赞
收藏
分享

微信扫一扫

【Leetcode】双指针-11


题目:

给你 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

举报

相关推荐

0 条评论