一、暴力解法:两个 for 循环,外层循环遍历所有可能的左边界,内层循环遍历所有可能的右边界
java
class Solution {
public int maxArea(int[] height) {
int max_area=0;
for(int i=0; i<height.length; i++){
for(int j=i+1; j<height.length; j++){
int x = j-i;
int y = height[i]<height[j]?height[i]:height[j];
int area = x*y;
max_area = max_area>area?max_area:area;
}
}
return max_area;
}
}
错误分析:当涉及的数组较大时,会超出时间限制
双指针:一个指向数组的头部,一个指向数组的尾部,然后我们计算当前两个指针所指向的边界能形成的容器的水容量,并更新最大值。
java
class Solution {
public int maxArea(int[] height) {
int left=0, right=height.length-1;
int max_area=0;
while(left<right){
int area = (right-left) * Math.min(height[left],height[right]);
max_area = Math.max(max_area,area);
// 保存值较大的边
if (height[left]>height[right]){
right--;
}
else{
left++;
}
}
return max_area;
}
}
注意:
- 有效利用
Math.min()
和Math.max()
函数 - 在更新left和right,保存值比较大的那一个