11. 盛最多水的容器

对撞指针

解题思路

  1. 定义 leftright 双指针分别指向数组的开始和结尾,定义一个面积 area 初始为 0

  2. 利用求和公式 S(i,j) = min(h[i], h[j]) × (j−i) 对现有位置求面积,并和 area 对比把最大值赋值给 area

  3. 收缩 leftright 指针,哪一个指针对应的板子低,则向中间移动哪一块板子;

  4. 重复 23 步骤直到 left >= right 结束循环,返回 area

复杂度

  1. 时间复杂度 O(N)

  2. 空间复杂度 O(1)

代码实现

var maxArea = function (height) {
    let left = 0;
    let right = height.length - 1;
    let area = 0;

    while (left < right) {
        // 面积
        let tmp = (right - left) * Math.min(height[left], height[right]);
        area = Math.max(tmp, area);
        height[left] < height[right] ? left++ : right--;
    }

    return area;
};
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 对撞指针
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现