# 盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和
(i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
** 说明:** 你不能倾斜容器。
示例
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 条线,你需要从中选择两条线构成一个容器。
容器的高度取决于左右两边红色的线的高度,宽度取决于底下左右两边红色线的距离
那么选择哪两条线,可以容纳最多的水呢?
做法:我们随便选择两条线,那么容纳的水就是蓝色块面积
如果与中间的先构成容器的话,那么宽度会变小,高度也会变小,那么肯定不会比蓝色面积大
高度不变,宽度变小,也不会比蓝色面积大
因此中间任何线都无法跟它构成最大容器了
如果要找容量比蓝色面积更大的线那么肯定不包含这条线
既然嗯 分别指向最左和最右边这样我们可以初始化两个
哪条线最短就移动哪条,如果一样长移动哪个都可以
移动之前先把当前面积答案计算出来如果比之前打就更新答案