题目说明:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
思路:
- 使用双指针,一个指在最前面,一个指在最后面。
- 装水的大小主要由最短的那个高度决定。暴力做法是一个一个慢慢移动,但实际上是,把最短的那个板移动一格,忽略的那部分面积不会比下一个面积大。
- 设面积为S(i,j)=min(h[i],h[j])×(j-i)。向内移动短板,水槽的短板min(h[i],h[j])可能会变大,面积会变大。向内移动长板是必然减小面积,因为短板不变或变小,长度也变小。
- 在状态S(i,j)下向内移动短板至S(i+1,j)(假设h[i]<h[j]),相当于消去了S(i,j-1),S(i,j-2),...,S(i,i+1)。这些都一定小于等于S(i,j)。因为短板高度相同或更短,底边长度更短。
- 所以这样的双指针移动不会导致丢失面积的最大值。
代码:
class Solution {
public int maxArea(int[] height) {
int i = 0, j = height.length - 1, res = 0;
while (i < j) {
if(height[i] < height[j]) {
res = Math.max(res, height[i] * (j-i));
i++;
} else {
res = Math.max(res, height[j] * (j-i));
j--;
}
}
return res;
}
}