[leetcode 11] Container With Most Water

题目:

Given n non-negative integers a1a2, ..., an, where each represents a point at coordinate (iai). n vertical lines are drawn such that the two endpoints of line i is at (iai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container.

思路:

1.由题意所知,题目实际是在二维坐标的第一象限给了一组坐标点(x1,y1),(x2,y2),```,(xn,yn),题目欲求两点xi,xj(j>i),使得(xj-xi)*min(yi,yj)在所有组合中最大;
2.观察第一象限的所有点会发现,若xk>xi,那么只有yk>yi,才有可能使得(xj-xk)*min(yk,yj)>(xj-xi)*min(yi,yj),同理,若xl<xj,只有yl>xj时,才有可能使得(xl-xi)*min(yi,yl)>(xj-xi)*min(yi,yj);(其实也就是说若从两边向中间挤压,要想保持容积不变或者使得容积增加,那么y方向的值必须增加);
3.算法的主要思路基于2,从头和尾向中间遍历数组,其实算法还可以简化为如果前指针所指数据小于后指针所指数据,那么前指针后移(不断寻找更高的点),反之,则后指针前移。

代码:

class Solution{
public:
	int maxArea(vector<int> &height){
		int front=0;
		int back=height.size()-1;
		int result=0;
		while(front < back)
		{
			int tmp=(back-front)*min(height[front],height[back]);
			result=result>tmp?result:tmp;
			if(height[front]<height[back])
				++front;
			else
				--back;
		}
		return result;
	}
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值