JavaScript算法每日一题盛最多水的容器

每日一题:每天一个新挑战;
循序渐进:从易到难,扎实掌握;
系统分类:按数据结构分类,有助于构建知识框架;
丰富题量:100 道精选题,覆盖简单/中等/困难难度。

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

示例 1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

提示:

  • n == height.length
  • 2 <= n <= 10^5
  • 0 <= height[i] <= 10^4

代码卡片

JavaScript算法每日一题盛最多水的容器

题目解析

给定一个整数数组 height,数组中的每个元素代表垂线的高度。要求在这些垂线中找到两条,使它们与 x 轴构成的容器能够容纳最多的水。注意容器不能倾斜,也就是说,水量的计算是基于两条垂线之间的最短高度和它们之间的距离。

方法一:双指针法

使用双指针法解决该问题。初始时,一个指针放在数组的起始位置,另一个指针放在数组的末尾。计算它们之间构成的容器的面积,然后移动高度较小的指针,向内收缩,继续计算新的面积,并不断更新最大面积,直到两个指针相遇。

  1. 初始化两个指针 leftright,分别指向数组的头和尾。
  2. 计算由 height[left]height[right] 构成的容器的面积。
  3. 如果 height[left] < height[right],则移动 left 指针,否则移动 right 指针。
  4. 不断更新最大面积,直到 leftright 指针相遇。
  5. 返回最大的面积。
  • 时间复杂度: O(n),其中 n 是数组的长度。算法只需要遍历一次数组,因此时间复杂度是线性的。
  • 空间复杂度: O(1),只使用了常数级别的额外空间。
var maxArea = function(height) {
    let left = 0;
    let right = height.length - 1;
    let maxArea = 0;

    while (left < right) {
        const currentArea = Math.min(height[left], height[right]) * (right - left);
        maxArea = Math.max(maxArea, currentArea);

        if (height[left] < height[right]) {
            left++;
        } else {
            right--;
        }
    }

    return maxArea;
};

总结

双指针法通过移动指针来缩小搜索范围,并且能够在 O(n) 的时间复杂度内找到最大的容器面积。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/288985
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 4小时前
下一篇 4小时前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注