盛水最多的容器

在这里插入图片描述

class Solution {

    public int maxArea(int[] height) {

        int n = height.length;
        int res = 0, left = 0, right = n - 1;

        while (left < right) {

            if (height[left] < height[right]) {

                res = Math.max(res, (right - left) * height[left]);
                left++;
            } else {

                res = Math.max(res, (right - left) * height[right]);
                right--;
            }
        }
        return res;
    }
}

双指针:left 指针和 right 指针,开始时 left 指针指向数组的开头,right 指针指向数组的结尾,即 left = 0,right = n - 1。

从两边向中间缩小,每次在缩小之前都要找到在两端的板子中较短的那一块,将其向中间缩小一格。

若缩小的是 left 和 right 指针指向的木板中较长的那一块,则只会使容器的蓄水量变小或不变。

当 left = 0,right = 8 时,res = 8,,若此时将 right 向左移动一位(长的),res = 7 变小了。

若缩小的是 left 和 right 指针指向的木板中较短的那一块,则容器的蓄水量会增大。

当 left = 0,right = 8 时,res = 8,,若此时将 left 向右移动一位(短的),res = 49 变大了。

蓄水量:res = Min(h[left], h[right]) * (right − left),由两端中较短的那一块木板来决定能够蓄水量(木桶原理)。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值