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.
题目的意思,应该是给定一串数组,a1,a2,... an,例如1,2,3,4 ,在坐标轴上画垂直的线,起点是(i,0)终点是(i,ai),这样坐标上就有n条竖线,然后求每两条竖线夹着的矩形面积(以长度短的竖线计算矩形,这样水才不会漏出来),返回最大的面积
class Solution {
public int maxArea(int[] height) {
int max = 0, area = 0;
for(int i=0; i<height.length; i++)
{
for(int j=i+1; j<height.length; j++)
{
if(height[i] <= height[j])
{
area = height[i]*(j-i);
}
else
{
area = height[j]*(j-i);
}
if(area > max)
{
max = area;
}
}
}
return max;
}
}
这种算是比较容易想到了,虽然答案是正确的,但是数据量大的时候速度就非常慢了,需要改进
这种是循环从前往后一个个算的,所以比较慢,下面这种是类似二分查找,从左和右两端开始算,矩形的面积取决于短的一边和两边之间x轴的长度,以此来移动左右指针
public int maxArea(int[] height) {
int left = 0, right = height.length - 1;
int max = 0, area = 0;
while (left < right)
{
if(height[left] < height[right])
{
area = height[left] * (right - left);
}
else
{
area = height[right] * (right - left);
}
if(area > max)
{
max = area;
}
if (height[left] < height[right])
{
left++;
}
else
{
right--;
}
}
return max;
}