【Leetcode】双指针-11

111 阅读1分钟

题目:

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