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.
Example:
Input: [1,8,6,2,5,4,8,3,7]
Output: 49
/**
* 暴力破解:也是最容易想到的方法 281ms
* 通过分析,我们可以知道,当传入的数据长度为n时,则间隔为n-1,
* 因此我们可以创建一个间隔数组:1,2,3,4......n-1;
* 然后通过遍历这两个数组元素中的每一个数字相乘,取结果最大值
* @param arr
* @return
*/
public static int solution1(int[] arr)
{
int len = arr.length;
int[] interval = new int[len -1];//数组中的间隔数
for(int i = 0; i < interval.length;i++)
{
interval[i] = (i+1);
}
int max = Integer.MIN_VALUE;
for(int i = 0; i < arr.length - 1;i++)
{
int k = i+1;//k为当前索引i以后的元素
for(int j = 0; j < interval.length - i ;j++)
{
max =Math.max(Math.min(arr[i],arr[k]) * interval[j],max);
k++;
}
}
return max;
}
/**
* 双指针法 2ms
* 设置首位两个指针i,j,当第i个元素小于第j个元素时,则向右移动
* 当第j个元素小于第i个元素时,向左移动
* 并且j - i ,刚好等于元素之间的间隔数
* @param height
* @return
*/
public static int solution2(int[] height)
{
int i =0;
int j = height.length - 1;
int max = Integer.MIN_VALUE;
while(i < j)
{
int temp = Math.min(height[i],height[j]);
int interval = j - i;
max = Math.max(temp* interval,max) ;
if(height[i] > height[j])
{
j--;
}
else
{
i++;
}
}
return max;
}