LeetCode Hot 100 No.11 盛水最多的容器

本文介绍了使用双指针法求解数组中能构成的最大矩形面积的问题。通过设置两个指针,一个从左向右,一个从右向左,不断更新最大面积并移动短板指针,避免无效操作,实现效率提升。当遇到高度相等的情况时,同时移动两个指针。这种方法体现了剪枝思想,能够有效地找到最大水槽面积。
摘要由CSDN通过智能技术生成

在这里插入图片描述
思路:
首先,设置两个指针i, j ,一个在最左边,一个在最右边。
每次将 h[ i ] , h[ j ] 中对应着较短的垂线的指针,向内缩进一个。不断移动i , j,直到 i 不小于j 为止。
记录每次指针之间的面积,最后输出最大面积。

为什么双指针法是对的呢?比如我们现在两个指针指向的h[ i ] < h[ j ]。i 指向的是短板,j 指向的是长板。如果我们固定 i ,向内移动 j,那么因为水槽的面积取决于短板的面积,不管 j 移动到的位置的板多长,水槽的面积只能比以前小。所以,i不动,j无论向内移动到什么位置,都会造成水槽面积变小。这样我们就省去了向内移动 j 的操作,这是剪枝的思想。每次我们只移动指向短板的指针。
还有一个问题,当 h[ i ] == h[ j ] 的时候,我们发现,无论固定 j 向内移动 i ,还是固定 i 向内移动 j ,都会造成水槽面积变小,所以这时候我们就同时将 i ,j 都向内移动一个。
@nettee写的这部分题解很精彩,推荐看一下: nettee盛水最多的容器题解

class Solution {
    public int maxArea(int[] height) {
        int i = 0;
        int j = height.length-1;
        int max = 0;
        while(i<j)
        {
            int hei = Math.min(height[i],height[j]);
            int dis = Math.abs(i-j);
            int sq = hei*dis;
            max = Math.max(max,sq);
            if(height[i]<height[j])
            {
                i++;
            }
            else if(height[i]>height[j])
            {
                j--;
            }
            else
            {
                i++;
                j--;
            }
        }
        return max;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值