描述:
給定 n 個(gè)非負(fù)整數(shù) a1悉抵,a2肩狂,...,an姥饰,每個(gè)數(shù)代表坐標(biāo)中的一個(gè)點(diǎn) (i, ai) 傻谁。在坐標(biāo)內(nèi)畫 n 條垂直線,垂直線 i 的兩個(gè)端點(diǎn)分別為 (i, ai) 和 (i, 0)列粪。找出其中的兩條線审磁,使得它們與 x 軸共同構(gòu)成的容器可以容納最多的水。
說明:你不能傾斜容器岂座,且 n 的值至少為 2态蒂。
圖中垂直線代表輸入數(shù)組 [1,8,6,2,5,4,8,3,7]。在此情況下费什,容器能夠容納水(表示為藍(lán)色部分)的最大值為 49钾恢。
示例:
輸入: [1,8,6,2,5,4,8,3,7]
輸出: 49
思路:
使用雙指針法,兩線段之間形成的區(qū)域總是會(huì)受到其中較短那條長(zhǎng)度的限制吕喘。此外赘那,兩線段距離越遠(yuǎn),得到的面積可能就越大氯质。
我們?cè)谟删€段長(zhǎng)度構(gòu)成的數(shù)組中使用兩個(gè)指針募舟,一個(gè)放在開始,一個(gè)置于末尾闻察。 同時(shí)拱礁,使用變量 maxarea
來持續(xù)存儲(chǔ)到目前為止所獲得的最大面積。 在每一步中辕漂,找出指針?biāo)赶虻膬蓷l線段形成的區(qū)域呢灶,更新 maxarea ,并將指向較短線段的指針向較長(zhǎng)線段那端移動(dòng)一步钉嘹。
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int maxarea = Integer.MIN_VALUE;
int left=0; int right = len-1;
while(left<right){
maxarea = Math.max(maxarea, Math.min(height[left],height[right]) * (right-left) );
if(height[left] < height[right])
left ++;
else
right--;
}
return maxarea;
}
}