思路
双指针解法,每次移动较小的那个指针
证明
当我们移动一个指针的时候,意味着我们觉得无论如何移动另一个指针都不可能比当前的解更优。
假设当前是height[l]
较小,那么向左移动r
是不可能得到一个比当前已经求得的max
更大的一个值,因为高度不可能上升,宽度却一直在缩小。即此时向左移动r
是没有意义的,那向右移动呢?当我们处在初始状态时,我们只能将一个指针向中间移动,移动的同时意味着我们将其“抛弃”了,最优的解要不就在当前l
,r
所处的区间内,要么就是已经求得max
值,所以在第一次移动的时候,意味着我们将区间缩小了1,再将指针往外移动是没有意义的。
代码
public int maxArea(int[] height) {
int l = 0, r = height.length - 1;
int max=0;
while (l < r) {
int now = Math.min(height[l], height[r]) * (r - l + 1);
max = Math.max(now, max);
if (height[r]<height[l]) r--;
else l++;
}
return max;
}