leetcode笔记—容纳最多水的容器

要找到条纵线然后这两条线以及X轴构成的容器能容纳最多的水。

思路:找到最大的 C = min( ai , aj ) * ( j- i) ;

一、从前往后遍历,每一个元素与后面所有元素进行比较,这种方法时间复杂度O(n*n),不能接受

int n=height.size();
        int max=0;
        for(int i=0;i<n-1;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                int min;
                if(height[i]>height[j]) min=height[j];
                else min=height[i];
                cout<<min;
                if(min*(j-i)>max) max=min*(j-i);
            }
        }
        return max;


二、从头和尾同时遍历

①: 在 j 的右端没有一条线会比它高! 假设存在 k |( j<k && ak > aj) ,那么  由 ak> aj,所以 min( ai,aj, ak) =min(ai,aj) ,所以由i, k构成的容器的容积C' = min(ai,aj ) * ( k-i) > C,与C是最值矛盾,所以得证j的后边不会有比它还高的线;

②:同理,在i的左边也不会有比它高的线;

这说明什么呢?如果我们目前得到的候选: 设为 x, y两条线(x< y),那么能够得到比它更大容积的新的两条边必然在  [x,y]区间内并且 ax' > =ax , ay'>= ay;

3.所以我们从两头向中间靠拢,同时更新候选值;在收缩区间的时候优先从  x, y中较小的边开始收缩;

int i = 0;
         int j = height.size() - 1;
          
         int ret = 0;
         while(i < j)
         {
             int area = (j - i) * min(height[i], height[j]);
             ret = max(ret, area);
             
             if (height[i] <= height[j])
                 i++;
             else
                 j--;
         }
         return ret;


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值