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 leftor rightiterators, 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)
while (heights[right] <= h && left < right)
return max_water;