11. 盛最多水的容器

一、题意
给定 n 个正整数 a1,a2,…,an,其中每个点的坐标用(i, ai)表示。 画 n 条直线,使得线 i 的两个端点处于(i,ai)和(i,0)处。请找出其中的两条直线,使得他们与 X 轴形成的容器能够装最多的水。

注意:你不能倾斜容器,n 至少是2。
二、分析和解答
1、显然是求x轴的距离乘以较短边ai值最大的区域!该区域面积等于两边距离乘以最短的高。
使用暴力解决:

    public int maxArea(int[] height) {
        int max = 0;
        for(int i=0;ilength;i++){
            for(int j=i;jlength;j++){
                int value = (j - i) * Math.min(height[i],height[j]);
                if(max < value)
                    max = value;
            }
        }
        return max;
    }

意料之内,超时了,不过案例是通过的。
2、然后,我思考了一番,普通的解法最少也是O(n^2)啦,而且有一个特点就是这两个指针都是从头开始向结尾遍历的,瞬间想起的就是快速排序里面两个指针从两边向中间游走!我就随便蒙了一下,感觉每次判断移动的标准应该是当前位置较小的值,结果竟然对了。代码如下:

    public int maxArea(int[] height) {
        int max = 0;
        int start = 0,end = height.length - 1;
        while(start < end){
            int value = (end - start) * Math.min(height[start],height[end]);
            if(max < value)
                max = value;
            if(height[start] < height[end])
                start++;
            else
                end--;

        }
        return max;
    }

然后,我考虑了一下原因:由于数组中的数都是正整数,也就是他们之间(即最短的高度)最少的差距是1,而每一个指针每次移动的距离也是1。所以y的值增加的幅度(每次较小值的指针移动)肯定会超过或等于1。

最短高度变化的影响大于两线之间距离的变化。

你可能感兴趣的:(LeetCode)