LeetCode11—盛最多水的容器(java版)

题目描述:

标签:数组    双指针

给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器。

 代码: 

思路分析:

1、数学分析:容器的容量取决于 底长 +  两侧垂直线的高度 。我们先让底长最大,然后去找使面积最大的垂直线高度。

2、代码分析:(1)定义双指针 left , right。分别指向数组的第一个元素和最后一个元素,此时的容器拥有最大的底长。

                       (2)此时先比较左右指针指向的元素大小,让小的元素移动指针,找到那个比当前高度大的下标(left++,right--)

                       (3)比较面积大小,存储最大面积

class Solution {
    public int maxArea(int[] height) {
        int len = height.length;
        int left = 0;
        int right = len-1;
        int maxsize = Math.min(height[left],height[right])*(right - left);
        while(left < right){
            if(height[left] < height[right]){
                int left0 = left;
                left++;
                while(height[left] < height[left0]){
                    left++;
                }
            }else{
                int right0 = right;
                right--;
                while(height[right] < height[right0]){
                    right--;
                }
            }
            int size = Math.min(height[left],height[right])*(right - left);
            if(size > maxsize){
                maxsize = size;
            }
        }
        return maxsize;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40840749/article/details/114228208