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 and n is at least 2. The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.

## Example

 ``````1 2 `````` ``````Input: [1,8,6,2,5,4,8,3,7] Output: 49 ``````

## Solution

• 使用双指针l和r指向两个端点的木板，向中间移动
• 若左侧木板更高，应继续尝试更高木板和其他木板的组合，即将右侧木板向左移动
• 若右侧木板更高，应继续尝试更高木板和其他木板的组合，即将左侧木板向右移动
• 面积公式是min{height[l],height[r]}*(r-l)
• `时间复杂度`：只遍历一次，O(n)
• `空间复杂度`：只用了指针和返回值，O(1)
• 实现：
 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 `````` ``````// Runtime: 28 ms, faster than 53.05% of C++ online submissions for Container With Most Water. // Memory Usage: 14.4 MB, less than 5.15% of C++ online submissions for Container With Most Water. class Solution { public: int maxArea(vector& height) { int l=0,r=height.size()-1; int ans=0; //双指针遍历 while(l!=r){ //min(height[l],height[r])*(r-l)是面积，求max是保留最大面积 ans=max(ans,min(height[l],height[r])*(r-l));、 //左侧更高时，应尝试左侧和其他木板的组合，故右侧木板向左推进 if(height[l]>height[r]) --r; else ++l; } return ans; } }; ``````