一、暴力解法:两个 for 循环,外层循环遍历所有可能的左边界,内层循环遍历所有可能的右边界
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;}
}
错误分析:当涉及的数组较大时,会超出时间限制
双指针:一个指向数组的头部,一个指向数组的尾部,然后我们计算当前两个指针所指向的边界能形成的容器的水容量,并更新最大值。
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,保存值比较大的那一个