题目
给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
输入:[1,8,6,2,5,4,8,3,7]
输出:49
public static void main(String[] args) {
int[] height = {2, 3, 4, 5, 18, 17, 6};
int left = 0;
int right = height.length - 1;
int result = 0;
while (left < right) {
result = height[left] < height[right] ?
Math.max(result, (right - left) * height[left++]) :
Math.max(result, (right - left) * height[right--]);
}
}
说明
由于前面做了几个简单的数组题目,所以一看到这个题,马上想到了「双指针」解法
首先在头尾分别指定指针。
无论左右怎么移动,每次长度会减一(所以可看作不变量)
高度:
若移动高的:那么高度会等于上次低的或低于,那么面积一定会小于
若移动底的:面积可能会变大
所以,每次移动高度低的,并且保存每次计算的面试最大值,那么最后记录的就是最大值
每次移动之后,可以看作把边界丢弃,相当于移动一步,数组长度小了一个