题目:
Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) 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;
}
};