題目描述
給定 n 個非負整數 a1,a2,...,an,每一個數表明座標中的一個點 (i, ai) 。畫 n 條垂直線,使得垂直線 i 的兩個端點分別爲 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器能夠容納最多的水。數組
注意:你不能傾斜容器,n 至少是2。spa
解題思路
考慮用雙指針法解題。維護兩個指針f、l分別指向數組左右兩端,則f和l構成的容器盛水體積計算公式爲min(height[f],height[l])*(l-f)。能夠看出盛水體積取決於容器邊中較小的數字和容器底長度。若移動較大的數字,則容器底長度會變小,而盛水的最大高度不變,因此盛水體積不會變動大。所以須要移動兩數中較小的數字,這樣若中間出現特別大的數字,則有可能提升盛水體積。而後每次移動完更新此時的最大盛水體積,直到兩指針相遇。指針
代碼
1 class Solution { 2 public: 3 int maxArea(vector<int>& height) { 4 int f=0,l=height.size()-1; 5 int maxA=-1; 6 while(f<l){ 7 int area=min(height[f],height[l])*(l-f); 8 if(area>maxA) 9 maxA=area; 10 if(height[f]<height[l]) 11 f++; 12 else l--; 13 } 14 return maxA; 15 } 16 };