
方法一:
java
class Solution {
public int maxArea(int[] height) {
//定义左右指针
int left = 0;
int right = height.length - 1;
//初始化最大储水量
int maxWater = 0;
//定义条件,只要左指针 < 右指针(两者没相遇)就继续
while(left < right){
//计算当前储水量
int currentWideth = right - left;
int currentHeight = Math.min(height[left],height[right]);
int currentWater = currentWideth * currentHeight;
maxWater = Math.max(currentWater,maxWater);
//指针移动找最大的currentHeight
if(height[left] < height[right]){
left++;
}else{
right--;
}
}
return maxWater;
}
}

方法二(省时间):
java
class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length - 1;
int maxWater = 0;
while(left < right){
int hLeft = height[left];
int hRight = height[right];
int minHeight = hLeft < hRight ? hLeft :hRight;
int currentWater = minHeight * (right - left);
if(currentWater > maxWater){
maxWater = currentWater;
}
//这里面又一次加上了,left < right,目的是防止连续的前进导致数组越界报错
if(hLeft < hRight){
while(left < right && height[left] <= minHeight){
left++;
}
}else{
while(left < right && height[right] <= minHeight){
right--;
}
}
}
return maxWater;
}
}

第二段代码更省时间主要体现在以下几方面:
第一,第二段代码直接在if-else里面的while循环选高的柱子,而第一段代码不仅每次都要读左右高度计算面积还要读左右高度进行比较选高的柱子,第二段代码省下了第一段代码中每次都要读左右高度用于计算面积这一步的读取。
第二,去掉第一段代码中的Math.min()和Math.max(),改成了if-else和三目运算符,这是底层机器指令,没有任何方法调用,cpu执行快。
第三,第一段代码无论碰到柱子是高是矮都进行一次面积计算,而第二段代码在while循环中进行柱子选择,只有遇到比原来高的柱子才进行面积计算,减少了大量无意义的计算。