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.
Given [1,3,2]
, the max area of the container is 2
.
Analysis:
Begin with the first point and last point, calculate the container area. Move the first point forward or last point backward if it is smaller.
1 public class Solution { 2 public int maxArea(int[] height) { 3 // corner case 4 if (height == null || height.length == 1) { 5 return 0; 6 } 7 8 int pStart = 0, pEnd = height.length - 1, maxArea = 0; 9 while (pStart < pEnd) { 10 int temp = (pEnd - pStart) * Math.min(height[pStart], height[pEnd]); 11 maxArea = Math.max(maxArea, temp); 12 13 // if the lenght of the line pointed by pStart is less than the length of the 14 // line pointed by pEnd we should increate pStart by 1, otherwise, decrease pEnd by 1. 15 if (height[pStart] < height[pEnd]) { 16 pStart++; 17 } else { 18 pEnd--; 19 } 20 } 21 return maxArea; 22 } 23 }