lintcode刷题——装最多水的容器

lintcode刷题之装最多水的容器,原题如下所示:

给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai)。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)(i, 0)。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。

 注意事项

容器不可倾斜。

样例

给出[1,3,2], 最大的储水面积是2.

这道题理解起来并不困难,具体思路如下:

1、首先想到的最笨的办法就是双重循环,出水面积就是两个点中的ai较小的值乘以两个点的下标的差值;

2、双重循环显然时间复杂度太高,这时想到用两个指针一头一尾向中间靠拢,若依旧使用两个for循环来做时间复杂度依旧不满足条件;

3、考虑用一个while循环,加上一个判断条件,就是装水的多少受限于短的一条线,于是加上判断,保留两者之中较长的一条线。

具体C++代码如下所示:

class Solution {
public:
    /*
     * @param : a vector of integers
     * @return: an integer
     */
    int maxArea(vector<int> heights) {
        // write your code here
        int l=heights.size();
        if(l==0||l==1)
        return 0;
        int watermax=0;
        int i=0,j=l-1;
       /* for(i=0;i<l;i++)
        {
            int lheight=heights[i];
            int li=i;
            for(j=l-1;j>i;j--)
            {
                watermax=max(min(lheight,heights[j])*(j-i),watermax);
            }
        }*/注释部分为两个for循环代码,时间超过限制
        while(i<j)
        {
           watermax=max(min(heights[i],heights[j])*(j-i),watermax);
           if(heights[i]<heights[j])
           {
               i++;
           }
           else
           {
               j--;
           }
        }
        return watermax;
    }
};


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值