暴力题解:双重for循环,时间复杂度O(n^2)
class Solution {
public int max(int a,int b){
if(a>=b) return a;
return b;
}
public int min(int a,int b){
if(a>=b) return b;
return a;
}
public int maxArea(int[] height) {
int n=height.length;
int res=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
res=max((j-i)*min(height[i],height[j]),res);
}
}
return res;
}
}
双指针:时间复杂度O(n)
一个指针指向开头,一个指向结尾,此时容器的底最大,当移动指针不管是左指针往右移动还是右指针往左移动都会使底-1,那么如何选择?
此时我们应该保持容器的高尽可能地大,所以当左指针指向的值小,左指针向右移动一个,同理,当右指针指向的值小,右指针向左移动一个。
class Solution {
public int maxArea(int[] height) {
int i = 0,j = height.length-1;
int ans = 0;
while(i < j){
ans = Math.max(ans,(j - i)*Math.min(height[i],height[j])) ;
if(height[i] >= height[j]) j--;
else i++;
}
return ans;
}
}