11 盛最多水的容器(暴力、双指针)
发布日期:2021-05-07 21:50:44 浏览次数:26 分类:精选文章

本文共 1045 字,大约阅读时间需要 3 分钟。

为了找到能够容纳最多水的两条垂直线,我们可以使用双指针的方法来优化计算过程。这种方法的时间复杂度为O(n),空间复杂度为O(1),非常高效。

思路分析

  • 问题理解

    • 给定n个非负整数,每个数代表坐标中的一个点(i, ai)。
    • 画n条垂直线,每条线的两个端点分别为(i, ai)和(i, 0)。
    • 目标是找到两条线,使得它们与x轴构成的容器可以容纳最多的水。
  • 直观思路

    • 水的体积取决于两根线中较低的那根的高度,乘以两根线之间的距离。
    • 通过暴力破解计算所有可能的两根线组合,虽然简单但时间复杂度为O(n^2),不适用于大规模数据。
  • 优化思路

    • 使用双指针技术,左指针l从数组开头开始,右指针r从数组末尾开始。
    • 每次比较左右两指针对应的高度,移动较短的指针以尽可能增加水量。
    • 计算当前水量并更新最大值,直到左右指针相遇。
  • 代码实现

    public int maxArea(int[] height) {
    int maxArea = 0;
    int l = 0;
    int r = height.length - 1;
    while (l < r) {
    int currentHeight = Math.min(height[l], height[r]);
    int currentWidth = r - l;
    int currentArea = currentHeight * currentWidth;
    if (currentArea > maxArea) {
    maxArea = currentArea;
    }
    if (height[l] < height[r]) {
    l++;
    } else {
    r--;
    }
    }
    return maxArea;
    }

    解释

    • 初始化:左指针l从数组起点开始,右指针r从数组终点开始。
    • 循环过程
      • 计算当前两根线的较小高度作为水的高度。
      • 计算当前两根线之间的横向距离。
      • 计算当前水量并更新最大值。
      • 将较短的指针(高度较小的那根线)向中间移动,以尝试找到更大的水量。
    • 终止条件:当左右指针相遇时,无法再找到更大的水量,循环结束。
    • 返回结果:最大水量即为所求。

    这种方法通过一次性遍历数组,避免了多次重复计算,确保了高效性和正确性。

    上一篇:怎么样修改Word的主题颜色
    下一篇:16 最接近的三数之和(排序、双指针)

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年03月23日 23时41分50秒