盛最多水的容器

题目描述:

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

思路:

	使用双指针的方法,时间复杂度O(n),从左右两端向中间夹逼,移动较短的柱子(容器		    的高取决于较短的柱子),比较记录最大面积

代码:

#
# @lc app=leetcode.cn id=11 lang=python3
#
# [11] 盛最多水的容器
#

# @lc code=start

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

class Solution:
    def maxArea(self, height: List[int]) -> int:
        # 左边下标
        left = 0
        # 右边下标
        right = len(height) - 1
        # 最大面积
        max_area = 0
        # 直到左右下标重合
        while left != right:
            # 移动更低的柱子
            if height[left] < height[right]:
                minheigtht = height[left]
                left += 1
            else:
                minheigtht =  height[right]
                right -= 1
            # 已经移动过柱子了,所以宽要加一
            max_area = max(max_area,minheigtht * (right - left + 1))

        return max_area
# @lc code=end
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值