题目链接:力扣
给定一个长度为 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
package 算法.数组.a11;
public class 盛最多水的容器 {
public static void main(String[] args) {
System.out.println(maxArea(new int[]{1,8,6,2,5,4,8,3,7}));
}
public static int maxArea(int[] height) {
int l=0;//这是左指针
int r=height.length-1;//这是右指针
int sum=0;//假设最大最初为0
while(l<r){//当左指针小于右指针,进入循环
sum = height[l]<height[r] ?//谁值小,移动谁
Math.max(sum,(r-l)*height[l++]):
Math.max(sum,(r-l)*height[r--]);//注意这里是--
}
return sum;
//双层循环,把所有面积求出来,把最大面积输出
// //面积:长x高 (j-i) x (小的数)
// int max = 0;//假设面积最大为0
// int sum;
// for(int i=0;i<height.length;i++){
// for(int j=i+1;j<height.length;j++){
// if(height[i]<height[j]){
// sum = height[i]*(j-i);
// }else{
// sum = height[j]*(j-i);
// }
// if(sum>max){
// max = sum;
// }
// }
// }
// return max;
}
}
注意:使用双重for循环会超出时间限制
所以,可以使用双指针。左指针、右指针一起移动,移动的时候谁的值小移动哪边。因为在两个边高度不变时,把高的移到中间,面积会越来越小(因为面积的高由低的一边决定);而把低的往中间移动,还有面积变大的可能;所以每次移动低的。