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.
解决这个问题我们使用对撞指针,即维护[l...r]一个范围的数组,初始值[0,a.length-1],
该思路的关键就是,如果a[l]<a[r]的话,那么l++,(如果r--的话那么得到的值一定会比之前小,l之前的元素也已经遍历过)
如果a[l]>a[r]的话,那么r--,(r之后的元素已经遍历过)
这样把这个数组遍历完就可找到最大值。
public static int maxArea(int[] height) {
int max = 0;
int l = 0;
int r = height.length-1;//[0...r]的区间内对撞指针找最大值
while(l<r)
{
max = max(max,min(height[l],height[r])*(r-l));
if(height[l]>height[r])
r--;
else
l++;
}
System.out.println(max);
return max;
}
public static int max(int a,int b)
{
if(a>b)
return a;
return b;
}
public static int min(int a,int b)
{
if(a>b)
return b;
return a;
}