求最大容積

給定 n 個非負整數 a1,a2,...,an,每一個數表明座標中的一個點 (iai) 。在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別爲 (iai) 和 (i, 0)。找出其中的兩條線,使得它們與 x 軸共同構成的容器能夠容納最多的水。數組

說明:你不能傾斜容器,且 n 的值至少爲 2。學習

圖中垂直線表明輸入數組 [1,8,6,2,5,4,8,3,7]。在此狀況下,容器可以容納水(表示爲藍色部分)的最大值爲 49。spa

 

示例:指針

輸入: [1,8,6,2,5,4,8,3,7]
輸出: 49
var maxArea = function(height) {
    // // 1. 暴力破解 (最佳 996ms)
    // // 時間複雜度: O(n的平方)
    // // 空間複雜度: O(1)
    // let resultVal = 0;
    // let arrLen = height.length;
    // for (let i=0; i<arrLen-1; i++) {
    //     for (let j=i+1; j<arrLen; j++) {
    //         let minVal = Math.min(height[i], height[j]);
    //         // console.log('[i, j]:', [i, j]);
    //         let tempVal = (j-i)*minVal;
    //         // console.log('\ttempVal:', tempVal);
    //         resultVal = Math.max(resultVal, tempVal);
    //     }
    // }
    // return resultVal;

    // 2. 雙指針 (最佳 92 ms)
    // 時間複雜度: O(n)
    // 空間複雜度: O(1)
    // TODO:證實待學習
    let arrLen = height.length;
    let [i, j, resultVal] = [0, arrLen-1, 0];
    while(i!==j) {
        let minVal = Math.min(height[i], height[j]);
console.log(minVal)
        let tempVal = (j-i)*minVal;
console.log(tempVal,'dd')
        resultVal = Math.max(resultVal, tempVal);
        height[i] <= height[j]? i++: j--;
    }
    return resultVal;
};
相關文章
相關標籤/搜索