首先想到的还是暴力解决方法,双循环如下:
class Solution {
public int maxArea(int[] height) {
int i = 0, j = 0;
int maxArea = 0;
for(i = 0; i < height.length; i++){
for(j = i+1; j < height.length; j++){
maxArea = Math.max(maxArea, Math.min(height[i], height[j]) * (j - i));
}
}
return maxArea;
}
}
当然这样肯定不行,O(n^2)复杂度。接下来考虑如何找到正确的解题思路。我们考虑什么情况下的计算是没有必要的。蓄水的多少取决于短板的长度以及两块板的距离,所以当某一个时刻左边的板短时,右边的板可以固定,让左边的板右移1位。原因是右边的板如果左移,无论左移几位一定没有原本的大(因为此时短板长度不变,距离减小)。左板大时相同。去掉这些计算过程将使时间复杂度降低。即考虑双指针方法,解法如下:
class Solution {
public int maxArea(int[] height) {
int left = 0, right = height.length -1;
int maxArea = 0;
while(right > left){
maxArea = Math.max(maxArea, Math.min(height[left], height[right]) * (right - left));
if(height[right] > height[left]){
left += 1;
}else{
right -= 1;
}
}
return maxArea;
}
}