# 11 Container With Most Water

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 Idea: Apply a greedy approach. Being with the widest lines (start and end) to first optimize the width. Then move `left`or `right`iterators, depending on whether or not it supports a height greater than the previous. In other words, ignore smaller heights until a larger one is found. An otherwise smaller height would be that the supported area will be smaller than the previous.
Complexity: O(n) time and O(1) space
int maxArea(vector<int>& heights) {
int left = 0, right = heights.size() - 1;
int max_water = 0;
while (left < right) {
int h = min(heights[left], heights[right]);
max_water = max(max_water, h * (right - left));
while (heights[left] <= h && left < right)
left++;
while (heights[right] <= h && left < right)
right--;
}
return max_water;
}