Leetcode Container With Most Water

原题意思是:

给定n个非负整数并记为ai,a2,,,,an,将下标i可以看成X轴横坐标,值ai看成纵坐标,与X轴会形成面积不一样的矩形,任意两条这样的线段和 x 轴组成一个木桶矩形,找出能够盛水最多的木桶,返回其面积。


注意面积大小S=min(ai,aj)|i-j|

最简单方法,暴力求解,时间复杂度O(n^2)

int maxArea1(vector<int> height){
int n=height.size();
int i,j;
int max=0;
for(i=0;i<n;i++)
    for(j=i+1;j<n;j++)
    {
	int tmp=min(height[i],height[j])*(j-i);
	if(tmp>max){max=tmp;continue;}
    }
return max;
}
提交超时!

用两个指针从两端开始向中间靠拢,如果:

1 左端线段短于右端,此时设左端线段长L,右端线段长R,当出现L<R时,说明该L线段与其他右端线段组成的矩形肯定要小于L与R组成的矩形,因为此时R第一次大于L,这些木桶是没必要判断的,因为这些木桶的容积肯定都没有L和R组成的木桶容积大,故直接i++即左端右移,;

反之右端左移,(类似分析)

直到左右两端移到中间重合,并且记录这个过程中每一次组成木桶的容积,返回其中最大的。

int maxArea(vector<int> height){
int n=height.size();
int max=0;
int i=0,j=n-1;
while(i<j){
    int tmp=min(height[i],height[j])*(j-i);
    if(height[i]<height[j])i++;
    else j--;
    if(max<tmp){max=tmp;}
           }
return max;
}

时间复杂度O(n)。AC!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值