# 盛最多水的容器

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

(i, height[i]) 。

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

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

** 说明:** 你不能倾斜容器。

示例

image-20231228112033492

public static int dan(int a[])
    {
   	  // 初始答案为 0
        int ans = 0;
   	  // 定义左指针 指向最左边
        int left = 0;
   	  // 定义有指针 指向最右边
        int right = a.length - 1;
        // 如果两个指针还没有相遇那么,就可以构成面积
        while (left < right)
        {
           	// 面积 = 底面的宽度 (下标的差) * 高度 (取最小值)
            int area = (right - left) * Math.min(a[left], a[right]);
            // 更新答案的最大值
            ans = Math.max(ans, area);
            // 判断 如果左边矮 就把 左边移动,如果右边矮 就把 右边移动
            if (a[left] < a[right])
            {
                left += 1;
            }
            else
            {
                right -= 1;
            }
        }
   	  // 返回最终答案
        return ans;
    }

思路分析

给你 n 条线,你需要从中选择两条线构成一个容器。

容器的高度取决于左右两边红色的线的高度,宽度取决于底下左右两边红色线的距离

那么选择哪两条线,可以容纳最多的水呢?

做法:我们随便选择两条线,那么容纳的水就是蓝色块面积

image-20240103085517968

如果与中间的先构成容器的话,那么宽度会变小,高度也会变小,那么肯定不会比蓝色面积大

image-20240103085616825

高度不变,宽度变小,也不会比蓝色面积大

因此中间任何线都无法跟它构成最大容器了

如果要找容量比蓝色面积更大的线那么肯定不包含这条线

image-20240103085749233

既然嗯 分别指向最左和最右边这样我们可以初始化两个

哪条线最短就移动哪条,如果一样长移动哪个都可以

移动之前先把当前面积答案计算出来如果比之前打就更新答案