victory的博客

长安一片月,万户捣衣声

0%

leetcode | 11.盛最多水的容器

11.盛最多水的容器

题目描述

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器。

题目链接

思路

  1. 双指针法
    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)