算法-力扣-011-盛最多水的容器

力扣[11]盛最多水的容器

题目

在这里插入图片描述
示例:输入:[1,8,6,2,5,4,8,3,7] 输出:49

题解1 思想:暴力枚举

用指针i代表左柱,用指针j代表右柱,指针i起始为0,指针j起始为1,i和j都向右走,穷举遍历每一个面积,直到找到最大的面积为止。代码如下:

    int max = 0;
    for (int i = 0; i < height.length - 1; i++) {
        for (int j = i + 1; j < height.length; j++) {
            int area = (j - i) * Math.min(height[i], height[j]);
            max = Math.max(area, max);
        }
    }
    return max;

此解法可以看出时间复杂度为O(n^2),故比较耗时
在这里插入图片描述

题解2 思想:左右夹逼

题解1中由于两个指针即左柱右柱都是由左向右进行移动来找寻面积最大值,那我们可以让左柱向右移动,右柱向左移动来找寻最大值,这样的话就只需要遍历一遍数组,显然,时间复杂度可以降低为O(n)。

分析:当左柱矮于右柱时,高度由左柱决定,右柱左移高度不可能增长,宽反而下降,故无需右柱左移动,即需左柱右移。同理,右柱矮于左柱时,为了使面积有可能增大,只能使右柱左移。代码如下:

    int max = 0;
    for (int i = 0, j = height.length - 1; i < j; ) {
        //令高度为左柱和右柱中较矮的柱,若左柱较矮,则左柱同时向右移动,右柱雷同
        int h = height[i] < height[j] ? height[i++] : height[j--];
        //注意由于左右柱均有移动一位的操作,故求底宽时需要+1
        max = Math.max(max, h * (j - i + 1));
    }
    return max;

题解2的时间复杂度为O(n)
在这里插入图片描述
对比题解1和题解2的执行时间,不难发现,题解2要快的很多,本题要尤其注意这正左右夹逼的思想!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值