給定 n 個非負整數 a1,a2,...,an,每個數代表坐標中的一個點 (i, ai) 。畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 (i, ai) 和 (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