双指针(4)——盛水最多的容器

题目:

这题可以暴力枚举,但会超时,所以我们要用其他方法。

我们就用示例1的数组为例,我们先取出一部分研究。

虽然我们不能用暴力枚举,但可以借用其思想。

对于6和4组成的容器,它可以储存24个单位的水。

如果我们此时让“4”去向内遍历(只看每一个数和4遍历的比较),根据木桶原理,这个容器的高不变,宽度会越来越小,即蓄水量越来越少。

那么我们就可以认为,在这几个数遍历到4时,从左到右是越来越小的。也就是我们就没必要再去遍历4(把4删除),因为我们是要求储水量最大值,接着在(6,2,5)之间遍历。

总结就是,我们先计算数组收尾构成的容积,然后比首尾,谁小谁就被删除。然后在新的数组重复此操作,直到首尾重合,然后比较所有的容积求最大值。

这里首尾比较去小的原理是,在某数组中,我们能确定在该容器宽度变化时,数组的高不变,去宽度最大作为该组的最大值,然后缩短数组(去小)继续重复此操作。 本质是在比较都是“最宽”的情况下谁最多。

int Max(vector<int>& height)
{
     int left=0,right=height.size()-1,ret=0;
      while(left<right)
         {
            int value =min(height[left],height[right])*(right-left);
                ret=max(ret,value);
             if(height[left]<height[right]) left++;
             else right--;
         }
      return ret;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值