/**
 * 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.
 * 
 * Tags: Array, Two pointers
 */
class ContainerWithMostWater {
    public static void main(String[] args) {
        
    }
    
    /**
     * 2 pointers, low and high
     * curArea = (high - low) * min(height[high], height[low])
     * maxArea = max(maxArea, curArea)
     * Move lower pointer towards center for the next loop
     * Stop when two pointers meet, cause one line can form a container
     * Different from block
     */
    public int maxArea(int[] height) {
        if (height == null || height.length == 0) return 0;
        int ans = 0;
        int low = 0, high = height.length - 1;
        while (low < high) { // note low < high, not <=
            // update answer
            ans = Math.max(ans, (high - low) * Math.min(height[low], height[high]));
            // move lower pointer towards center
            if (height[low] < height[high]) low++;	//Narrow bottom needs the higher heighth.
            else high--;
        }
        return ans;
    }
}

/**
 * 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.
 * 
 * Tags: Array, Two pointers
 */
class ContainerWithMostWater {
    public static void main(String[] args) {
        
    }
    
    /**
     * 2 pointers, low and high
     * curArea = (high - low) * min(height[high], height[low])
     * maxArea = max(maxArea, curArea)
     * Move lower pointer towards center for the next loop
     * Stop when two pointers meet, cause one line can form a container
     * Different from block
     */
    public int maxArea(int[] height) {
        if (height == null || height.length == 0) return 0;
        int ans = 0;
        int low = 0, high = height.length - 1;
        while (low < high) { // note low < high, not <=
            // update answer
            ans = Math.max(ans, (high - low) * Math.min(height[low], height[high]));
            // move lower pointer towards center
            if (height[low] < height[high]) low++;
            else high--;
        }
        return ans;
    }
}

Revert "Added comments."