LeetCode 热题100-7-盛水最多的容器

核心思想:首尾双指针
时间复杂度:O(n)(如果使用双重for,复杂度为O(n2),超时)
为什么移动高度较小的指针?
答1:由于容纳的水量是由:两个指针指向的数字中较小值 * 指针之间的距离。如果我们移动数字较大的那个指针,那么前者「两个指针指向的数字中较小值」不会增加,后者「指针之间的距离」会减小,那么这个乘积会减小,我们的目标是乘积要向大的地方变化,所以,移动数字较大的那个指针是不合理的。因此,移动数字较小的那个指针。
答2:在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽底边宽度 −1​ 变短:
若向内 移动短板 ,水槽的短板min(h[i],h[j]) 可能变大,因此下个水槽的面积可能增大 。
若向内 移动长板 ,水槽的短板min(h[i],h[j])​ 不变或变小,因此下个水槽的面积一定变小 ,因为容积取决于最小边。
因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。

class Solution {
    public int maxArea(int[] height) {
        int s_max = 0;
        int l_min = 0;
        int head = 0;
        int tail = height.length - 1;
        int s = 0;
        while(head < tail){
            l_min = Math.min(height[head],height[tail]);
            s = l_min * (tail - head);
            if(s > s_max){
                s_max = s;
            }
            if(height[head] > height[tail]){
                tail--;
            }else{
                head++;
            }
        }
        return s_max;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值