为什么双指针的做法是正确的,因为在移动之前记录下了当前的最大值,在移动时只移动两边中短的一边,如果移动后面积更大,那就替换最大值,如果移动后面积更小,对记录好的最大值也没有影响。
public class 盛水最多的容器11 {
public static void main(String[] args) {
// 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
// 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
// 返回容器可以储存的最大水量。
// 说明:你不能倾斜容器。
// 示例 1:
// 输入:[1,8,6,2,5,4,8,3,7]
// 输出:49
// 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
// 示例 2:
// 输入:height = [1,1]
// 输出:1
}
public static int maxArea(int[] height) {
int maxA = 0;
int i = 0, j = height.length-1;
while(i < j){
maxA = (j-i)*(height[j]<height[i]?height[j]:height[i]) > maxA ? (j-i)*(height[j]<height[i]?height[j]:height[i]) : maxA;
if(height[i] > height[j]){
j--;
}else{
i++;
}
}
return maxA;
}
}