1. 程式人生 > >LeetCode筆記 ------11. 盛最多水的容器

LeetCode筆記 ------11. 盛最多水的容器

寫在前邊

本文為系列文章,記錄自己在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