盛最多水的容器:找两条线装水最多

#leetcode #算法/双指针

11. 盛最多水的容器

目录

1. 总结

  • 左右指针技巧:
    • leftright 两个指针从==两端中心向收缩==
    • 边收缩边计算即可

2. 题目及理解

image.png|536

3. 解题思路

  • 左右指针技巧
  • leftright 两个指针从==两端==向中心收缩,
    • 一边收缩一边计算 [left, right] 之间的矩形面积,取最大的面积值即是答案
      • 矩形面积 = left 的高度 * right 的高度

4. 代码实现

/**
 * @param {number[]} height
 * @return {number}
 */
var maxArea = function (height) {
  let left = 0; // 左指针
  let right = height.length - 1; // 右指针
  let max = 0; // 最大面积

  // 当左指针小于右指针时,执行循环
  // 这里的循环条件是left < right,而不是left <= right
  while (left < right) {
    // 计算当前左右指针对应的面积
    //  [left, right] 之间的矩形面积 为什么是这个公式?
    // 因为矩形的面积是由两个因素决定的:底边和高度,底边是两个指针之间的距离,
    // 高度是两个指针对应的元素中的较小值
    const area = Math.min(height[left], height[right]) * (right - left);
    // 更新最大面积
    max = Math.max(max, area);
    // 如果左指针对应的元素小于右指针对应的元素
    if (height[left] < height[right]) {
      // 左指针右移
      left++;
    } else {
      // 右指针左移
      right--;
    }
  }
  return max;
};

4.1. 复杂度分析

5. 错误记录

注意下面的公式,别搞混了

image.png|824

6. 参考