盛最多水的桶

题目描述:

        给定一个非负整数序列:序列中依次表示高度。在坐标系内画出这么多条线( 线的端点为(i, hi) (i, 0)),在其中寻找两条线使得两条线所构成的容器可以容纳最多的水。

分析:

        

方法一: 暴力解法

        1.遍历左右边

        2.找出所有面积

        3.取最大值

方法二: 双指针法

        1.设置两个指针,分别对应左右两边

        2.计算当前所对应的容器容量

        3.移动较短的指针向内移动

Python代码(暴力解法就不展示了,下面的是双指针解法):

def maxArea(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:
            r -= 1
    return ans


list = [1, 6, 2, 8, 7, 2, 2, 8, 9, 5]
r = maxArea(list)
print(r)

可以对上面稍微进行改进:

def maxArea(height):
    i, j = 0, len(height) - 1
    maxArea = 0
    while i < j:
        h, w = min(height[i], height[j]), j - i
        maxArea = max(maxArea, h * w)  # record before the move
        curr = min(height[i], height[j])
        if height[i] < height[j]:
            while height[i] <= curr and i < j:
                i += 1
        else:
            while height[j] <= curr and i < j:
                j -= 1
    return maxArea


list = [1, 6, 2, 8, 7, 2, 2, 8, 9, 5]
r = maxArea(list)
print(r)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值