11. 盛最多水的容器|刷题打卡

144 阅读1分钟

一、题目描述

二、解题思路

/**
 * @param {number[]} height
 * @return {number}
 * 是一道动态规划,求最大值。
 * 进行优化,砍重复计算分支
 * 求每一次的面积:min(height1, height2) * (index2 - index1);
 * 先写出计算每个情况的表达式
 * 然后在优化
 * 执行用时:1164 ms, 在所有 JavaScript 提交中击败了28.66%的用户
 * 内存消耗:40.3 MB, 在所有 JavaScript 提交中击败了90.28%的用户
 * 方案一:采用冒泡循环穷举,时间复杂度:O(n^2)
 */
var maxArea = function(height) {
    let max = 0;
    for (let i = 0; i < height.length - 1; i++) {
        for (let j = i + 1; j < height.length; j++) {
            const area = Math.min(height[i], height[j]) * (j - i);
            max = max < area ? area : max;
        }
    }

    return max;
};

/**
 * 看了题解,是一道标准的双指针问题,两边向中间移动搜索。
 * 思路是:两个指针分别指向两端,每次判断哪一个指针值比较小,
 * 然后移动比较小的。因为每一次移动距离会变小,那么大的保证最大边,改变小的即可
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

var maxArea = function(height) {
    let i = 0;
    let j = height.length - 1;
    let res = 0;
    while (i < j) {
        res = Math.max(res, Math.min(height[i], height[j])*(j-i));
        if (height[i] > height[j]) {
            j--
        } else {
            i++
        }
    }

    return res
}

// 总结,双指针问题是不是可以通过冒泡解决,相反冒泡的题是否都可以通过双指针进行优化