盛最多的水

image-20200502172416383

暴力求解

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;
}
原文地址:https://www.cnblogs.com/yh-simon/p/12818810.html