盛最多水的容器

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

注意:你不能倾斜容器,n 至少是2。

 

首先需要指出的是该问题描述不清晰,两条线与x轴如何能构成一个容器,以x轴为直径的圆为底,两条线较短者为高构成一个容器?

看了下LeetCode上的解答,都是计算两条线与x轴构成最大的面积。如下内容也是按照计算最大面积求解。

对于(i, ai)  、 (j, aj)与x轴构成的面积area=(j-i) * min(ai, aj)

 

数组height存储了每个点,height[i]代表(i, ai)

求解放法:

可以选择两个指针p,q分别指向height的前后两个节点      maxArea=(q-p) * Math.min(height[p], height[q])

若height[p]>height[q] 就移动q使q减1,  这是由于若移动p(p++),则新得到的area一定小于上步,(q-p)减小了1,min(height[p],height[q])也小于等于上步。

反之p++

 

代码如下:

    public static int maxArea(int[] height) {

        int p = 0;
        int q = height.length - 1;
        int maxArea = 0;

        int temp;
        while (p<q) {
            temp = (q-p)*Math.min(height[p], height[q]);
            maxArea = maxArea>temp?maxArea:temp;
            if (height[p]<height[q]) p++;
            else q--;
        }
        return maxArea;
    }

 

 

备注:

最大面积并不一定是最大容量,如果按照最大容量计算,maxCapacity = pi*(q-p)/2*(q-p)/2 * min(height[p], height[q])

上述方法依然可行,只需将maxArea 改为 double型的maxCapacity

posted on 2018-04-23 20:52  Deltadeblog  阅读(1524)  评论(0编辑  收藏  举报

导航