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.
求两条垂直线之间的最大容水量,即直线围成的长方形面积。
一开始向通过贪婪算法来解决本题,发现Si和Si-1没有很直接的推导关系,因此贪婪算法不适合本题。
通过暴力求解的方法肯定能得出答案,但是会TimeOut。其实解题的时候,实在找不到好的解法,才会考虑暴力求解。
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int maxLen = 0, val = 0;
for (int i = 0; i < len; ++ i){
for (int j = i+1; j < len; ++ j){
val = Math.min(height[j],height[i])*(j-i);
if (val > maxLen){
maxLen = val;
}
}
}
return maxLen;
}
}
因此暴力求解不适合本题目。这里面仔细看题目,题目中ai为正整数,令Sij为(i, ai)和(j, aj)两个点围成的面积,如果ai < ai+1,则有S(i+1)j >= Sij;若ai >= ai + 1,则有S(i+1)j < Sij。需要注意的是,如果ai为浮点数,则不能满足上述关系。
class Solution {
public int maxArea(int[] height) {
int maxCapacity = 0;
int l = 0, r = height.length - 1;
while (l < r){
maxCapacity = Math.max(maxCapacity, Math.min(height[l], height[r])*(r-l));
if (height[l] < height[r]){
l ++;
}
else {
r --;
}
}
return maxCapacity;
}
}