zoukankan      html  css  js  c++  java
  • [LeetCode in Python] 11 (M) container with most water 盛最多水的容器

    题目

    https://leetcode-cn.com/problems/container-with-most-water/

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

    说明:你不能倾斜容器,且 n 的值至少为 2。

    图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

    示例:

    输入:[1,8,6,2,5,4,8,3,7]
    输出:49

    解题思路

    • 双指针分别从头尾向内靠拢
    • 移动条件是左边比右边矮,就将左指针向右移动,否则右指针向左移动
    • 面积就是矮的高度×两个指针的水平距离

    代码

    class Solution:
        def maxArea(self, height: List[int]) -> int:
            max_area = 0
    
            # - two pointers from both side
            left, right = 0, len(height)-1
    
            # - keep close until touch
            while left<right:
                # - update max area
                lh, rh = height[left], height[right]
                max_area = max(max_area, min(lh, rh)*(right-left))
    
                # - try to find better position
                if lh < rh:
                    left += 1
                else:
                    right -= 1
                    
            return max_area
    
  • 相关阅读:
    codeforces 980A Links and Pearls
    zoj 3640 Help Me Escape
    sgu 495 Kids and Prizes
    poj 3071 Football
    hdu 3853 LOOPS
    hdu 4035 Maze
    hdu 4405 Aeroplane chess
    poj 2096 Collecting Bugs
    scu 4444 Travel
    zoj 3870 Team Formation
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/12723667.html
Copyright © 2011-2022 走看看