Description:
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.
题意:坐标轴上有n条垂直于x轴的直线,求任意的两根线与x轴所围成的容器的容量的最大值;要注意的是容器不可以倾斜,因此决定容量的那个最关键的因素是最短的那根线;
第一种解法(超时):暴力求解,通过遍历所有的可能,选择容量最大的那个值;但是时间复杂度达到了O(n2);
class Solution {
public int maxArea(int[] height) {
int mostWater = 0;
for(int i=0; i<height.length; i++){
for(int j=i+1; j<height.length; j++){
mostWater = Math.max(mostWater, (j-i) * Math.min(height[i], height[j]));
}
}
return mostWater;
}
}
第二种解法:假设两条直线之间的距离是一样的,这时候决定容量大小的因素就是两直线最短的那根,因此我们可以从两端向中间遍历,移向更长的那根;
class Solution {
public int maxArea(int[] height) {
int mostWater = 0;
int st = 0;//左直线下标
int ed = height.length - 1;//右直线下标
while(st < ed){
mostWater = Math.max(mostWater, Math.min(height[st], height[ed]) * (ed - st));
if(height[st] < height[ed]) st++;
else ed--;
}
return mostWater;
}
}