★11. 盛最多水的容器(2种方法)

11. 盛最多水的容器

本题颇有短板效应的感觉。
自己想的算法也AC了,这里都记录下来。
一个是双指针算法,一个是优化有的双循环算法,都可以AC。

双指针算法。

短板效应
短板效应,即桶之间的水取决于较短的那个板子。
考虑左右指针l 和 r,l向右移, r 向左移,所以l 和 r边界是逐渐缩小的,唯一能做的就是让height[l]和height[r],即这个板子长一点。
考虑如下情景:
如果此时的板子一边长,一边短,是该移动长的还是短的还是随机?
答案是移动短的

因为就算是移动长的,能装的水也一定不会变多

为什么一定不会变多?
因为不管移动长的还是短的,左右边界是逐渐往里收缩越靠越近的。所以边界会变小。那往里的时候遇到一个非常大的数呢?

eg: 1 2 2000 3

对于上面的例子而言,如果移动3到2000的位置,能乘多少水呢?
1和2000的板子,那也是短板效应,也是看1,所以边界小了,两端的值也没有变大。血亏

所以上面的答案就出来了,移动短的,这时才有可能让能乘的水可能变多。

所以大体的思路是

设置双指针l 和 r,然后在当前位置计算一下能存的水,然后比较一下height[l]和height[r]哪个大。将小的那个向中间移动就可以。

ACCode

class Solution {
   
    public int maxArea(int[] height) {
   
        int n = height.length, l = 0, r = n - 1;
        int res = 0;
        while
  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值