11. Container With Most Water

题目大意:

坐标轴上,有n个点,坐标分别是(1,a1)、(2,a2)...(n,an),其中,纵坐标均是非负整数。

从中选取两个坐标,使其与x轴形成一个盛水容器,求最大的盛水量,注意,斜面不能盛水。

大致思路:

刚开始,用的是暴力解法,分别取距离为1/2/3/4/5...n,然后取最大值,时间复杂度为O(n2),在测试集合比较大的情况下会超时。

后面,参考网上的方法,大致想法如下.

1.初始化:从两边的坐标开始,左边高度为LH,右边高度为RH,结果初始化res=0.

求得盛水量与res取较大值,赋予res.

2.循环:

若LH<RH,则将LH往右移动,直到碰到一个比原LH大的坐标,因为若比元LH小,同时和RH的距离也短,那么结果肯定比原LH和RH的结果小,可以过滤掉,

为什么是移动LH和RH较小者,原理同上,因为最小者是计算采用的值,类似于木桶的短板。

同理,若RH<LH,则将RH往左移动,直到找到比原RH大的值。

3,返回结果。

这种方法,时间复杂度降为O(n).

代码如下:

int min(int a,int b){
    if(a<=b) return a;
    else return b;
}
int maxArea(int* height, int heightSize) {
    if(height<=1) return 0;
    int i,j,temp;
    int res=0;
    for(i=0,j=heightSize-1;ires) res=min(height[i],height[j])*(j-i);
        if(height[i]<=height[j]){
            temp=height[i];
            i++;
            while(height[i]<=temp&&i

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值