11.盛最多水的容器

算法思路
此类问题用双指针法,效率最高。双指针,顾名思义就是使用两个指针变量,分别初始化为开始位置和末尾位置,在条件适合时,i++或j–;直到i和j相等,循环结束。

矩阵的面积与两个因素有关:
矩阵的长度:两条垂直线的距离
矩阵的宽度:两条垂直线其中较短一条的长度
因此,要矩阵面积最大化,两条垂直线的距离越远越好,两条垂直线的最短长度也要越长越好。

设置两个指针 left 和 right,分别指向数组的最左端和最右端。此时,两条垂直线的距离是最远的,若要下一个矩阵面积比当前面积来得大,必须要把 height[left] 和 height[right] 中较短的垂直线往中间移动,看看是否可以找到更长的垂直线。若位置left的值小于位置right的值,left加1,否则right减1,每次求得maxarea = max(maxarea,(j-i)*max(height[i],height[j])),直到left

代码

class Solution {
    public int maxArea(int[] height)
    {
        /*双指针法 left左指针,right右指针,
        当left
        int left = 0,right = height.length-1,maxarea = 0;
        while(left<right){
            maxarea = Math.max(maxarea,(right-left)*Math.min(height[left],height[right]));                  
            if(height[left] <= height[right]) left++;
            else right--;
        }
        return maxarea;
        /*
        int i=0,j=height.length-1,maxarea = 0;
        while(i!=j)
        {
            int high = height[i]>=height[j] ? height[j] : height[i];
            maxarea = maxarea >= ((j-i)*high) ? maxarea : (j-i)*high;
            if(height[i] >= height[j])
                j--;
            else
                i++;
        }
        return maxarea;      
        */ 
    }
}

复杂度
时间复杂度:O(N),只进行了一趟遍历
空间复杂度:O(1),没有额外开辟空间

你可能感兴趣的:(LeetCode)