Loading...

不用暴力枚举!双指针教你秒杀盛水问题

在这里插入图片描述

求解思路

这道题我们从数组两端开始,用左右指针夹逼,每次计算当前能装多少水(面积等于两条线中较短的那条乘以它们的距离),然后更新最大值。

关键的问题是:

下一步该移动哪个指针?

答案是移动较矮的那一边。

为什么呢?

因为容器的容量由短板决定,如果我们移动高的那边,宽度变小了,而高度最多也只能维持原来的短板高度,面积只会更小;

但如果移动矮的那边,虽然宽度也变小了,但我们有可能遇到一条更高的线,从而突破原来的短板限制,获得更大的面积。

就这样一直移动较矮的一边,不断尝试找到更优的组合,直到左右指针相遇,这时我们就遍历了所有可能获得最大面积的情况。

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public static int maxArea(int[] height) {
    int ans = 0;
    for (int l = 0, r = height.length - 1; l < r;) {
        ans = Math.max(ans, Math.min(height[l], height[r]) * (r - l));
        if (height[l] <= height[r]) {
            l++;
        } else {
            r--;
        }
    }
    return ans;
}

举个栗子

假设 height = [1, 8, 6, 2, 5, 4, 8, 3, 7]:

  1. 初始: l=0(高度1), r=8(高度7), 面积 = min(1,7) × 8 = 8
  2. 移动矮的(左): l=1(高度8), r=8(高度7), 面积 = min(8,7) × 7 = 49
  3. 移动矮的(右): l=1(高度8), r=7(高度3), 面积 = min(8,3) × 6 = 18
  4. 移动矮的(右): l=1(高度8), r=6(高度8), 面积 = min(8,8) × 5 = 40
  5. 继续移动…最终得到最大面积 49

如果觉得有帮助,欢迎点赞、关注、转发~

最后更新于 2026-04-05 17:35:33
Code Road Record