LeetCode筆記 ------11. 盛最多水的容器
阿新 • • 發佈:2019-02-03
寫在前邊
本文為系列文章,記錄自己在leetcode上刷題的一些筆記,歡迎大家一塊兒討論。
題目描述
給定 n 個非負整數 a1,a2,…,an,每個數代表座標中的一個點 (i, ai) 。畫 n 條垂直線,使得垂直線 i 的兩個端點分別為 (i, ai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。
注意:你不能傾斜容器,n 至少是2。
解決思路
方法一:
暴力解法:第一個數字和後邊所有的數字一一比較進行計算面積,很好理解,話不多說直接上程式碼
var maxArea = function(height) {
var i ,j;
var maxarea=0;
for(i=0;i<height.length;i++){
for(j=i+1;j<height.length;j++){
maxarea = Math.max(Math.min(height[i],height[j]) * (j-i),maxarea);
}
}
return maxarea;
};
但是這種方法 時間複雜度為 O(n^2)計算n*(n-1)/2種組合高度。
方法二:
採用雙指標法,設兩個指標,一個從前向後,一個從後向前進行遍歷,這道題很像生活中的木桶原理,都是受限與數字較小的數字,此外,兩線段距離越遠,得到的面積就越大。
現在,為了使面積最大化,我們需要考慮更長的兩條線段之間的區域。如果我們試圖將指向較長線段的指標向內側移動,矩形區域的面積將受限於較短的線段而不會獲得任何增加
var maxArea = function(height) {
var l = 0 ;
var r = height.length-1;
var maxarea = 0;
while(l<r){
maxarea = Math.max(maxarea,Math.min(height[l],height[r])*(r-l));
if (height[l]<height[r])
l++;
else
r--;
}
return maxarea;
};
程式碼啥的已經更新在GitHub上,歡迎大家指點github