盛最多的水
暴力求解
public int maxArea(int[] heights){
int max=0,temp=0,len=height.length;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
temp=(j-i)*Math.min(height[i],height[j]);
max=Math.max(max,temp);
}
}
return max;
}
优化
解题思路
- 准备两个指针,一个指向开头,一个指向结尾,此时容器的底最大的
- 随着指针向内移动,会造成容器的底变小,在这种情况下想让容器盛水变多,就只能在容器的嗷下功夫。
- 那我们如何决策哪个指针移动呢?我们能够发现不管是左指针向右移一位,还是右指针想左移一位,容器的底都是一样的,都比原来减少了1。
- 这种情况下我们想要让指针移动后的容器面积增大,就要使移动后的容器的高尽量大,所以我们选择所指的高较小的那个指针进行移动,这样我们就保留了容器较高的那条边,放弃了较小的那条边,以获得更高的边的机会
代码
public int maxArea(int[] heights){
if(height==null||height.length==0) return -1;
int i=0,j=heights.length-1,ans=0;
while(i<j){
int h=Math.min(heights[i],heights[j]);
ans=Math.max(ans,h*(j-i));
if(heights[i]<heights[j]){
i++;
}else{
j--;
}
}
return ans;
}