盛最多水的容器

盛最多水的容器

盛最多水的容器

暴力题解:双重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;
     }
}