Problem:
给定一个长度为 n 的整数数组height。有n条垂线,第 i 条线的两个端点是(i, 0)和(i, height[i])。 * 找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水。 * 返回容器可以储存的最大水量。 * 说明:你不能倾斜容器。
实例图解1:
1.解法一:
暴力算法:双重for循环遍历所有存在的矩形 找到最大容积 时间复杂度为n方
2.解法二:
利用双指针确定矩形
由题意我们可知 所求容积面积为
设i为头指针 j为尾指针
Area=(j-i)*Max(尾指针的高,头指针的高)
所以问题就归到了指针如何移动,以及确定指针的位置的问题上来了
当height[i]>height[j]时,如果移动头指针,由于尾指针不移动,那么围成的容积一定是不变或者减少的。
同理当height[i]<height[j]时,只有移动短的指针才有可能使面积增大
因此得出 指针移动的方法为:不断向内移动短指针
代码解法:
public static int Solution(int[] height) {
//求矩形的面积
//比较任意两个下标围成的矩形面积
//短边影响矩形的面积 area=短高*两下标的距离
//i为左边的指针 j为右边的指针 res为两指针的容积
int i=0,j=height.length-1,res=0;
while (i<j){
res=height[i]>height[j]?
Math.max(res,(j-i)*(height[j--])):
Math.max(res,(j-i)*(height[i++]));
}
return res;
}