题目如下:
解题:
- 一个容器盛水的多少是由边界较短的线决定的,即 最短的线长度 x 两根线的距离=盛水的多少
- 使用双指针 left,right,在初始时,左右指针分别指向数组的左右两端,然后向中部移动,让数组中每个元素都可以做容器的边界。
- 首先我们先计算出left和right可以存储水的量,即:
Math.min(left,right)
x(right-left)
,然后更新可存最大水量area。 - 然后一直移动数值较小的指针,然后计算出可以存储水的量与可存最大水量area作比较,如果大于则更新area。直至指针两个指针重合,即可算出可存最大水量。
- 为什么移动数值较小的指针,而不移动较大的指针呢?
首先我们假设指针指的数分别为i 和 j ,若 i>j ,距离为t则当前容器可储存水量为min(i,j) x t = j x t 。
若移动数值大指针,假设移动后指向的数为i1 显然移动后t是递减的
当 i1 >i 时 min(i1 ,j) = min(i,j)
当 i1 ≤ i 时min(i1 ,j) ≤ min(i,j)
所以移动较大的指针,无论指向的数为多少,构成的容器盛水量不可能大于当前容器盛水量
代码:
class Solution {
public int maxArea(int[] height) {
//初始化两个指针
int left=0;int right=height.length-1;
int area=0;//最大盛水量
while (left<right){//循环到指针重合结束
if (height[left]<height[right]){//判断左右指针哪个值小
area=Math.max(area,height[left]*(right-left));
left++;//移动指针
}else {
area=Math.max(area,height[right]*(right-left));
right--;//移动指针
}
}
return area;
}
}