盛最多水的容器


給定 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM